7

Primefaces 3.5,Mojarra 2.1.14。这是我的 PF 数据表,它包含一个名为“自动”的不可编辑的布尔列和可编辑的“标签”列:

<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>

单元格编辑事件监听器:

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();
        }
    }
}   

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

我也试过

    <p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="list"/>

它正确更新了复选框,但也会导致焦点丢失,并浪费带宽。

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

4

2 回答 2

5

p:ajax的标签p:dataTable在某个特定的行或列中没有,所以你很容易更新一些相关的组件ID。您可以借助RequestContext更新单元格中的特定组件。因此,从您的方法中删除update并将p:ajax其添加到您的onEditLabel方法中:

RequestContext.getCurrentInstance().update(
  s.getClientId(FacesContext.getCurrentInstance()) +
  ":" + event.getRowIndex() +
  ":isAutomatic"
);

如您所见,单元格内组件的 id 在您分配的 id 之前具有行号。

于 2013-03-06T22:37:46.280 回答
2

我相信您可以解决这个问题,而无需知道您要更新的组件的 ID 的详细信息。您可以将其作为参数传递给 bean。

首先,绑定要更新的组件。您实际上并不需要此组件绑定到的 bean。您只需要定义一些值,您可以稍后在 JSF 中使用这些值来识别该组件。所以在你的情况下,你会做这样的事情:

<p:selectBooleanCheckbox binding="#{isAutomaticComponent}" value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox>

现在,在您进行更新时访问该组件。IE:

<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel(isAutomaticComponent.clientId)}" />

现在,您可以在不知道 ID 内容的情况下从 cellEdit 事件方法更新组件。IE:

public void onEditLabel(CellEditEvent event, String idOfComponentToUpdate) {
...
RequestContext.getCurrentInstance().update(idOfComponentToUpdate);
...
于 2014-01-27T19:01:44.787 回答