Primefaces 3.5, Mojarra 2.1.14. Đây là DataTable PF của tôi, nó có chứa một cột boolean không thể chỉnh sửa tên 'tự động', và có thể chỉnh sửa 'nhãn' cột:Cách cập nhật hàng cụ thể trong Primefaces datatable
<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>
di động chỉnh sửa sự kiện nghe:
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();
}
}
}
Các tế bào công trình biên tập, gửi dữ liệu đến người nghe và nó được lưu giữ chính xác đến cơ sở dữ liệu. Cờ 'tự động' cũng bị xóa bởi trình lắng nghe sự kiện chỉnh sửa ô và được duy trì chính xác đến cơ sở dữ liệu. Vấn đề là hộp kiểm 'tự động' không được cập nhật trên máy khách.
Tôi cũng đã cố gắng
<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="list"/>
đó cập nhật một cách chính xác vào hộp kiểm, nhưng cũng gây chú trọng bị mất, và chất thải băng thông.
Làm cách nào để cập nhật chỉ một ô cụ thể sau khi sự kiện cellEdit được kích hoạt?
Cảm ơn! Điều này làm việc, nhưng chắc chắn không phải là thực hành tốt nhất. Đầu tiên, tôi dựa vào quy ước đặt tên thành phần id cụ thể. Thứ hai, bean điều khiển của tôi bây giờ chứa logic frontend (xem ID). Giải pháp tốt nhất là thêm một tính năng như vậy vào PF DataTable. Thở dài. :) – rootkit
Tôi hoàn toàn không đồng ý với bạn. Backing bean được kết hợp chặt chẽ với lớp trình bày (ví dụ như của bạn từ phương thức gọi phương thức sao lưu cuộc gọi AJAX). Nó sẽ là xấu nếu bạn đặt logic kinh doanh trong đậu ủng hộ. Tôi đồng ý rằng việc đặt id trong bean sao lưu không phải là rất tốt đẹp, nhưng trong thời điểm này tôi không thấy bất kỳ giải pháp dễ dàng nào. – partlov
Tôi đồng ý không có giải pháp dễ dàng, điều này sẽ phải làm. Cảm ơn một lần nữa! – rootkit