UIにJSF + Primefacesを使用しているWebアプリケーションがあります。データテーブルのrowSelectイベントでのAJAX呼び出しなどのAJAX呼び出しを使用する場合、特にWebページにダーティチェックを適用するのが難しいことに直面しています。
以下は、AJAX 呼び出しでダーティ チェックを適用する正確なシナリオです。以下は、私の Web ページで使用しているコンポーネントです。
1)「companyBean」という名前の Bean によって入力される 1 つの dataTable があります (会社の属性を持つ)
<p:dataTable id="basic" var="company" value="#{companyInfoBean.companyList}"
rowKey="#{company.id}"
selection="#{companyInfoBean.selectedCompany}" selectionMode="single">
<p:ajax event="rowSelect" update=":customerDataForm:customerDataFields" />
<p:column id="modelHeader">
<f:facet name="header">
<h:outputText value="Company Name" />
</f:facet>
<h:outputText value="#{company.companyName}" />
</p:column>
more columns....
</p:dataTable>
上記のように、選択した行(AJAX 呼び出し)で、ページの下部にあるフォームの値を更新します。
<h:form id="customerDataForm">
<p:panel id="customerDataFields">
<p:panelGrid >
<p:row>
<p:column>
<h:outputLabel for="companyname" value="Company Name " />
</p:column>
<p:column>
<p:inputText id="companyname" value="#{companyInfoBean.selectedCompany.companyName}" label="Company Name" />
</p:column>
more columns...
<p:row>
<p:column colspan="2" style="text-align:right">
<p:commandButton value="Save" actionListener="#{companyInfoBean.updateCompany}"
update=":customerDataForm:customerDataTable"/>
</p:column>
<p:column colspan="2" style="text-align:left">
<p:commandButton value="Undo" />
</p:column>
</p:row>
上記のフォームでは、ユーザーはデータテーブルのrowSelectで更新された値を編集できます。
ここで、データテーブルのrowSelectionのフォームのダーティチェックが必要です。つまり、rowSelectのAJAX呼び出しの実行にもかかわらず、ユーザーが使用したフォームに保存されていない変更がある場合にプロンプトが表示されます..
基本的に、このシナリオから理解できること..簡単ではなく、条件付きベースのAJAX呼び出しが必要です。または、いくつかの jQuery を使用してダーティ チェックを実装する必要があります。