如何更新Primefaces数据表中的特定行

roo*_*kit 7 primefaces

Primefaces 3.5,Mojarra 2.1.14.这是我的PF数据表,它包含一个名为'automatic'的不可编辑的布尔列,以及可编辑的'label'列:

<p:dataTable value="#{bean.contents}" paginator="true" var="row" 
  editable="true" editMode="cell" rows="25" rowsPerPageTemplate="10,25,50" id="list">
    <p:column>
        <f:facet name="header"><h:outputText value="header1" /></f:facet>
        <p:selectBooleanCheckbox value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox>
    </p:column>
    <p:column>
        <f:facet name="header"><h:outputText value="header2" /></f:facet>
        <p:cellEditor>
            <f:facet name="output">
                <h:outputText value="#{row.label}"></h:outputText>
            </f:facet>
            <f:facet name="input">
                <p:inputText value="#{row.label}"></p:inputText>
            </f:facet>
        </p:cellEditor>
    </p:column>
    <p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="isAutomatic"/>
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)

单元格编辑事件监听器:

public void onEditLabel(CellEditEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();

    if(newValue != null && !newValue.equals(oldValue)) {
        DataTable s = (DataTable) event.getSource();
        MyEntity d = (MyEntity) s.getRowData();
        try {
            d.setAutomatic(false);
            myDAO.save(d);
            addMessage("Change saved!");
        } catch (Exception ex) {
            addErrorMessage("Label could not be saved!");
            getFacesContext().validationFailed();
        }
    }
}   
Run Code Online (Sandbox Code Playgroud)

单元格编辑器工作,将数据发送到侦听器,并将其正确保存到数据库.单元格编辑事件监听器也会清除"自动"标志,并将其正确保存到数据库中.问题是客户端上没有更新"自动"复选框.

我也试过了

    <p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="list"/>
Run Code Online (Sandbox Code Playgroud)

这正确地更新了复选框,但也导致焦点丢失,并浪费带宽.

在触发cellEdit事件后,如何仅更新特定单元格?

par*_*lov 5

您在某个特定的行或列中p:ajax标记为p:dataTableno,因此您可以轻松更新某些相对组件ID.您可以帮助RequestContext更新单元格中的特定组件.因此,请updatep:ajax您的onEditLabel方法中删除并添加:

RequestContext.getCurrentInstance().update(
  s.getClientId(FacesContext.getCurrentInstance()) +
  ":" + event.getRowIndex() +
  ":isAutomatic"
);
Run Code Online (Sandbox Code Playgroud)

如您所见,单元格内部组件的ID在您指定的ID之前具有行号.

  • 我不同意你的看法。支持bean与表示层紧密耦合(例如,您从AJAX侦听器调用支持bean方法)。如果将业务逻辑放在后备bean中,那将是不好的。我同意将id放在backing bean中不是很好,但是在这一刻,我看不到任何简单的解决方案。 (2认同)