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