Jsf PrimeFaces DataTable RowEditor正在更新RowEditInit上的单元格元素,但不更新RowEdit或RowEditCancel上的单元格元素
我有以下xhtml:Jsf PrimeFaces DataTable RowEditor正在更新RowEditInit上的单元格元素,但不更新RowEdit或RowEditCancel上的单元格元素,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我有以下xhtml: <h:form> ... <p:dataTable id="table" value="#{BEAN.rows} var="row" > <p:ajax event="rowEdit" listener="#{BEAN.rowEdit}" /> <p:ajax event="rowEditInit" listener="#{BEAN.rowEditInit}" /> <p:ajax event="
<h:form>
...
<p:dataTable id="table" value="#{BEAN.rows} var="row" >
<p:ajax event="rowEdit" listener="#{BEAN.rowEdit}" />
<p:ajax event="rowEditInit" listener="#{BEAN.rowEditInit}" />
<p:ajax event="rowEditCancel" listener="#{BEAN.rowEditCancel}" />
...
<p:columns id="columnsElement"
value="#{BEAN.columns} var="column" >
<f:facet name="header" >
<h:outputText value="#{column.code}" />
<p:selectBooleanCheckbox id="selectAll"
disabled="#{BEAN.rowInEdit}" />
</f:facet>
<p:cellEditor>
<f:facet name="output">
<p:selectBooleanCheckbox id="cellCheck"
disabled="#{BEAN.rowInEdit} />
</f:facet>
<f:facet name="input">
<p:selectBooleanCheckbox id="selectAll"
disabled="true" />
</f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable> </h:form>
...
我在datatable之外使用
解决了这个问题,如下所示
并将oncomplete=“updatedataable()”
添加到rowEdit
和rowEditCancel
ajax事件中
这给了我期望的最终结果,但我仍然很好奇为什么我的初始解决方案不起作用,或者是否有更好的解决方案。请使用XHTML,而不是使用不透明、不可读和不可管理的Java代码。这将更容易维护。您的意思是使用update=“…”
?我没有使用它,因为无法知道将有多少行/列,所以我需要以这种方式添加用于更新的ID。。。我是根据这个问题的答案得出这个结论的。如果很难阅读,我道歉,在我的实际代码中有注释和JavaDocs,希望能让它更好,但是为了这个问题,我尝试使代码更通用一些,并删除这些注释以节省一些空间。
public void rowEditInit(RowEditEvent event) {
rowInEdit = true;
UIData table = (UIData) event.getComponent();
String tableId = table.getClientId();
updateTableCheckboxes(tableId, table.getRowIndex()); }
public void rowEdit(RowEditEvent event) {
rowInEdit = false;
UIData table = (UIData) event.getComponent();
String tableId = table.getClientId();
updateTableCheckboxes(tableId, table.getRowIndex()); } // same for rowEditCancel
public void updateTableCheckboxes(String tableId, int index) {
int rowNumber = 0;
for (RowData row : rows) {
int columnNumber = 0;
for (ColumnData column : columns) {
if (row != index) {
String updateCheckboxId = tableId + ":" + rowNumber
+ ":columnsElement:" + columnNumber + ":cellCheck";
FacesContext.getCurrentInstance()
.getPartialViewContext().getRenderIds()
.add(updateCheckboxId);
}
columnNumber++;
}
rowNumber++;
}
columnNumber = 0;
while (columnNumber < columns.size()) {
String selectAllCheckboxId = tableId + ":columnsElement:"
+ columnNumber + ":selectAll";
FacesContext.getCurrentInstance().getPartialViewContext()
.getRenderIds().add(selectAllCheckboxId);
columnNumber++;
}}