Spring Webflow 2.4.1,Spring 1.1,JSF 2.2.3和Primefaces 5.1
我有一个dataTable,在每一行中都有2个布尔复选框来修改字段。用户可以修改条目或删除整行。
<h:form id="editForm">
<p:dataTable id="permissionTable" var="sdp" rowIndexVar="rowIndex" value="${serverDirectoryPermissions}">
<p:column>
<f:facet name="header">
<h:outputText value="name" />
</f:facet>
<div>
<h:outputText value="${sdp.name}"/>
</div>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="upload permission" />
</f:facet>
<div>
<p:selectBooleanCheckbox id="canUploadCheck" value="${sdp.hasUploadPermission}" />
</div>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="delete permission" />
</f:facet>
<div>
<p:selectBooleanCheckbox id="canDeleteCheck" value="${sdp.hasDeletePermission}" />
</div>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value=" " />
</f:facet>
<div>
<p:commandButton id="removePermission" value="${tmsg.messages.sys_button_remove}" action="${documentManager.removeServerDirectoryPermission(serverDirectoryPermissions,sdp)}" ajax="true" process=":editForm" update=":editForm" immediate="true"/>
</div>
</p:column>
</p:dataTable>
</h:form>
单击时,删除按钮会触发一个操作,从原始列表中删除所选条目,然后ajax调用刷新表单(以及表格)
public void removeServerDirectoryPermission(List<ServerDirectoryPermission> sdps, ServerDirectoryPermission sdpToRemove) {
sdps.remove(sdpToRemove);
}
当表刷新时,将删除正确的行。问题是删除行下面的所有复选框都采用了它们正上方的行的值。
e.g。
row1 true false row2 false true row3是真的 row4 false false
删除row2后:
row1 true false row3 false true row4 true true
我调试了后端,并且row3和row4的bean中的值尚未更新,因此它只显示错误值的GUI。如果我保存新值,则会保存。
我在删除条目和更新数据表的方式上做错了吗?
对于completenes,serverDirectoryPermissions是flowScope变量中的列表,当按下保存按钮时,它会在数据库中保留。保存过程正常,因此我省略了代码。
非常感谢
&GT;&GT;&GT;编辑&lt;&lt;&lt;
我在Primefaces组件中添加了一些id,我注意到在Ajax更新后JSF重建表时,所有的ID都会被移位。所以,在上面的例子中:
row1 checkbox_id0 row2 checkbox_id1 row3 checkbox_id2 row4 checkbox_id3
删除后:
row1 checkbox_id0 row3 checkbox_id1 row4 checkbox_id2
由于我可以验证是否已从列表中删除了正确的行,因此我怀疑JSF正在按ID存储输入值。删除行后,id会移位,但JSF会忽略它,并根据原始ID保留值的映射。事实上,如果在此之后我添加了一个新行,则会自动使用checkbox_id3的值填充此行。
我怎么能告诉JSF已经删除了一行?我应该尝试直接从后端操作dataTable吗?