我有一个使用 Primefaces 3.5 的数据表,如下所示。
现在我正在编辑 id 为 43 的第二行,如下图所示。
当我单击对勾(最右边的列)时,该行被编辑,如下图所示。
可以很容易地注意到,州的名称从更改为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 展示示例就像这样演示)。
这与更新页脚值动态显示一列的数值总数相同。更新该列中的行时不会更新页脚。该问题已在此处报告。