【发布时间】:2016-01-11 15:09:13
【问题描述】:
我有以下 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="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>
使用 RowEdit 侦听器如下:
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++;
}}
这是动态填充 columnsElement 中要更新的复选框的 ID,并且对于 rowEditInit 工作正常,按预期禁用所有复选框。当我单击 rowEdit 或 rowEditCancel 事件的勾号/叉号时,要更新的 Id 填充完全相同,但只有已编辑行的复选框被重新启用。
如果我单击屏幕上其他位置的组件或重新启用的复选框之一,那么其他行的复选框和 selectAll 复选框也会奇怪地重新启用。
我已尝试像this blog 那样调试 JSF 生命周期阶段,但生命周期的所有阶段对于 Init、Edit 和 Cancel 的调用完全相同。
据我所知,我正在做同样的事情,但在不同的情况下会得到不同的结果。有什么建议为什么会发生这种情况?
谢谢
【问题讨论】:
-
请使用 XHTML 而不是使用不透明、不可读和难以管理的 Java 代码来做同样的事情。这会更容易且易于维护。
-
您的意思是使用
update="..."?我没有使用它,因为无法知道会有多少行/列,所以我需要以这种方式添加 Id 进行更新......我基于这个问题的答案 stackoverflow.com/questions/20901447/… 。抱歉,如果难以阅读,在我的实际代码中,有 cmets 和 JavaDocs 希望使它变得更好,但是为了这个问题,我试图使代码更通用并删除这些 cmets 以节省一些空间.
标签: jsf primefaces datatable