p:dataTable中的Primefaces复选框混合在已删除的行

时间:2015-11-17 10:30:31

标签: spring jsf primefaces

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="&nbsp;&nbsp;" />
   </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吗?

0 个答案:

没有答案