Primefaces 3.5,Mojarra 2.1.14。这是我的PF数据表,它包含了一个名为“自动”一个不可编辑的布尔列,并编辑“标签”列:如何更新Primefaces数据表中的特定行
<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事件触发后更新特定单元格?
谢谢!这有效,但绝对不是最佳做法。首先,我依靠特定的组件id命名约定。其次,我的控制器bean现在包含前端逻辑(视图ID)。最好的解决方案是将这样的功能添加到PF DataTable中。叹。 :) – rootkit 2013-03-07 16:31:26
我不完全同意你的看法。 Backing bean与表示层紧密结合(例如,您可以通过AJAX listener调用backing bean方法)。如果您将业务逻辑放入backing bean中,那将会很糟糕。我同意将id放在backing bean中并不是很好,但在这一刻我没有看到任何简单的解决方案。 – partlov 2013-03-07 18:11:41
我同意没有简单的解决方案,这将不得不做。再次感谢! – rootkit 2013-03-07 18:27:06