以下に示すように、Primefaces 3.5 を使用した dataTable があります。
次の画像に示すように、ID 43 の 2 行目を編集しています。
目盛り (一番右の列) をクリックすると、次の図に示すように行が編集されます。
xxxx
州の名前が からに変更されていることは容易にわかりますが、国はからzzz
に更新されることが予想されるままであるように見えます。America
Germany
rowEdit
実際にはデータベースに変更が加えられていますが、イベントの完了時に dataTable に反映されていないようです。
国に加えられた変更を確認するには、ページをリロードする必要があります。このページがリロードされた場合にのみ、以下に示すように正しいデータが表示されます。
これは、国ドロップ ボックスが表示される列です。
<p:ajax event="rowEdit" listener="#{stateManagedBean.onRowEdit}" update=":form:dataTable :form:systemMessages :form:messages" process=":form:dataTable :form:systemMessages :form:messages"/>
<p:ajax event="rowEditCancel" listener="#{stateManagedBean.onRowEditCancel}" update=":form:systemMessages :form:messages" process=":form:systemMessages :form:messages"/>
<p:column headerText="Country" sortBy="#{state.country.countryName}" filterBy="#{state.country.countryName}" filterMaxLength="45">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{state.country.countryName}" />
</f:facet>
<f:facet name="input">
<p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" rendered="true" editable="false" converter="#{longConverter}" converterMessage="The supplied value is incorrect." required="true" requiredMessage="Select an appropriate option." style="width:100%;">
<f:selectItems var="country" value="#{stateManagedBean.countries}" itemLabel="${country.countryName}" itemValue="${country.countryId}" itemLabelEscaped="true" rendered="true"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
以下はonRowEdit()
、ティックがクリックされたときにトリガーされるメソッド (JSF マネージド Bean 内) です。
public void onRowEdit(RowEditEvent event)
{
StateTable stateTable=(StateTable) event.getObject();
if(stateService.update(stateTable))
{
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Success : ", "The row with the id "+stateTable.getStateId()+" has been updated successfully.");
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
JSF マネージド BeanおよびJSF ページの完全なコード。
このrowEdit()
メソッドでは (上記のように)stateTable.getCountry().getCountryId()
更新されたものを表示しますが、この国オブジェクトを使用して、古い国名 (更新されたものではない) を表示するだけのcountryId
ように、対応する国名を参照します。stateTable.getCountry().getCountryName()
これを回避する方法は何ですか?
重要:
上記の XHTML コード スニペットでは、両方の value 属性、
<h:outputText value="#{state.country.countryName}"/>
^^^^^^^^^^^^^_^^^^^^^^^^^
<p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" .../>
^^^^^^^^^^^^^_^^^^^^^^^
国 ID を表示して対応する国 ID を参照する代わりに、国名を表示することが不可欠です。
それらが同じvalue
属性を反映するように変更された場合、
<h:outputText value="#{state.country.countryId}"/>
^^^^^^^^^^^^^_^^^^^^^^^
<p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" .../>
^^^^^^^^^^^^^_^^^^^^^^^
その後、期待どおりに機能します(Primefacesショーケースの例は、このように示します)。
列の数値の合計を示すフッター値を動的に更新するのと同じです。その列の行を更新している間、フッターは更新されません。この問題はこちらで報告されています。