PrimeFaces DataTable RowEditor更新RowEditInit上的单元格元素,但不更新RowEdit或RowEditCancel

时间:2016-01-11 15:09:14

标签: jsf primefaces datatable

我有以下xhtml:

<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事件的勾选/交叉时,要更新的ID将完全相同,但只会重新启用已编辑行的复选框。 / p>

如果我点击屏幕上其他位置的某个组件或其中一个重新启用的复选框,则选中其他行的复选框,并且所有选中复选框都会重新启用。

我已尝试在this blog中调试JSF生命周期阶段,但生命周期的所有阶段对于Init,Edit和Cancel都被称为完全相同。

据我所知,我做同样的事情,但在不同情况下得到不同的结果。有什么建议可以解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:1)

我已设法使用<p:remoteCommand/>在数据表之外修复此问题,如下所示......

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

并将oncomplete="updateDataTable()"添加到rowEditrowEditCancel ajax事件中。

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