【问题标题】:PrimeFaces DataTable RowEditor updating cell elements on RowEditInit, but not on RowEdit or RowEditCancelPrimeFaces DataTable RowEditor 在 RowEditInit 上更新单元格元素,但不在 RowEdit 或 RowEditCancel 上
【发布时间】:2016-01-11 15:09:13
【问题描述】:

我有以下 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 填充完全相同,但只有已编辑行的复选框被重新启用。

如果我单击屏幕上其他位置的组件或重新启用的复选框之一,那么其他行的复选框和 selectAll 复选框也会奇怪地重新启用。

我已尝试像this blog 那样调试 JSF 生命周期阶段,但生命周期的所有阶段对于 Init、Edit 和 Cancel 的调用完全相同。

据我所知,我正在做同样的事情,但在不同的情况下会得到不同的结果。有什么建议为什么会发生这种情况?

谢谢

【问题讨论】:

  • 请使用 XHTML 而不是使用不透明、不可读和难以管理的 Java 代码来做同样的事情。这会更容易且易于维护。
  • 您的意思是使用update="..."?我没有使用它,因为无法知道会有多少行/列,所以我需要以这种方式添加 Id 进行更新......我基于这个问题的答案 stackoverflow.com/questions/20901447/… 。抱歉,如果难以阅读,在我的实际代码中,有 cmets 和 JavaDocs 希望使它变得更好,但是为了这个问题,我试图使代码更通用并删除这些 cmets 以节省一些空间.

标签: jsf primefaces datatable


【解决方案1】:

我已经设法在数据表之外使用&lt;p:remoteCommand/&gt; 解决了这个问题,如下所示...

&lt;p:remoteCommand name="updateDataTable" update="table" /&gt;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2019-12-22
    • 2016-06-29
    相关资源
    最近更新 更多