2016-01-11 20 views
0

我有以下XHTML:PrimeFaces上RowEditInit数据表RowEditor更新电池元件,但不能在RowEdit或RowEditCancel

<h:form> 
... 
<p:dataTable id="table" value="#{BEAN.rows} var="row" > 
    <p:ajax event="rowEdit" listener="#{BEAN.rowEdit}" /> 
    <p:ajax event="rowEditInit" listener="#{BEAN.rowEditInit}" /> 
    <p:ajax event="rowEditCancel" listener="#{BEAN.rowEditCancel}" /> 
    ... 
    <p:columns id="columnsElement" 
     value="#{BEAN.columns} var="column" > 
     <f:facet name="header" > 
      <h:outputText value="#{column.code}" /> 
      <p:selectBooleanCheckbox id="selectAll" 
       disabled="#{BEAN.rowInEdit}" /> 
     </f:facet> 

     <p:cellEditor> 
      <f:facet name="output"> 
       <p:selectBooleanCheckbox id="cellCheck" 
        disabled="#{BEAN.rowInEdit} /> 
      </f:facet> 
      <f:facet name="input"> 
       <p:selectBooleanCheckbox id="selectAll" 
       disabled="true" /> 
      </f:facet> 
     </p:cellEditor> 
    </p:columns> 
</p:dataTable> </h:form> 

随着RowEdit听众如下:

public void rowEditInit(RowEditEvent event) { 
rowInEdit = true; 
UIData table = (UIData) event.getComponent(); 
String tableId = table.getClientId(); 
updateTableCheckboxes(tableId, table.getRowIndex());  } 

public void rowEdit(RowEditEvent event) { 
rowInEdit = false; 
UIData table = (UIData) event.getComponent(); 
String tableId = table.getClientId(); 
updateTableCheckboxes(tableId, table.getRowIndex()); } // same for rowEditCancel 

public void updateTableCheckboxes(String tableId, int index) { 
int rowNumber = 0; 
for (RowData row : rows) { 
    int columnNumber = 0; 
    for (ColumnData column : columns) { 
     if (row != index) { 
      String updateCheckboxId = tableId + ":" + rowNumber 
       + ":columnsElement:" + columnNumber + ":cellCheck"; 
      FacesContext.getCurrentInstance() 
       .getPartialViewContext().getRenderIds() 
       .add(updateCheckboxId); 
     } 
     columnNumber++; 
    } 
    rowNumber++; 
} 

columnNumber = 0; 
while (columnNumber < columns.size()) { 
    String selectAllCheckboxId = tableId + ":columnsElement:" 
     + columnNumber + ":selectAll"; 
    FacesContext.getCurrentInstance().getPartialViewContext() 
     .getRenderIds().add(selectAllCheckboxId); 
    columnNumber++; 
}} 

这被动态地填充columnsElement中的复选框的ID将被更新并且对于rowEditInit正在正常工作,按预期禁用所有复选框。当我点击rowEditrowEditCancel事件的勾号/交叉时,要更新的Ids被填充完全相同,但只有已编辑的行的复选框被重新启用。

如果我的设备上点击屏幕或重新启用的复选框中的一个在别处再检查其他行的框和全选复选框都重新启用,以及奇怪。

我试着调试JSF生命周期阶段,如this blog,但生命周期的所有阶段在Init,Edit和Cancel中调用完全相同。

至于我可以看到我在做同样的事情,但得到在不同情况下不同的结果。任何建议,为什么会发生这种情况?

感谢

+1

使用XHTML,而不是使用不透明,无法阅读和无法控制的Java代码,请这样做。这将是更容易和维护友好。 – Tiny

+0

你的意思是使用'update =“...”'?我没有使用过,因为没有办法知道将有多少行/列,所以我需要添加Ids进行更新这种方式...我已经基于这个问题的答案http:// stackoverflow.com/questions/20901447/primefaces-datatable-rowedit-not-updating-cell-element。道歉,如果它很难阅读,在我的实际代码中有评论和JavaDocs希望使它更好,但为了这个问题,我试图使代码更通用一些,并删除这些注释以节省一些空间。 – hello123

回答

0

我已经成功如下解决这个使用<p:remoteCommand/>外DataTable的...

<p:remoteCommand name="updateDataTable" update="table" />

并添加oncomplete="updateDataTable()"rowEditrowEditCancel AJAX事件。

这给了我期望的最终结果,但我仍然很好奇为什么我的初始解决方案不起作用或者有更好的解决方案。

相关问题