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 事件后,如何仅更新特定单元格?