版本:
RichFaces 4.3.5
Apache MyFaces 2.1
问题:
如下面的代码所示,我在h:selectBoolenCheckbox
rich:dataTable.
面临以下问题
1)当逐个检查多个复选框并且点击之间有相当长的延迟时,没有问题。 点击复选框。
2)但是,如果单击复选框没有延迟,则不会选中所有复选框。如果选择两个复选框非常快,则只选择第一个。 在对这个问题进行研究之后,发现第二个请求并没有调用所需对象的setter方法,只保留其值为false。
我的问题是:
1)为什么第二个请求不会调用对象的setter方法?这是因为第一次请求处理仍未完成?
2)如何解决这个问题?我尝试使用immediate="true"
但没有成功。
使用java脚本可能是选项。
但是当选中一个复选框时会涉及复杂的逻辑,一些复选框将被自动选择和禁用,具体取决于
当前所选复选框的值。
此逻辑在app.value
getter方法中处理。
代码:
清单1:
<h:panelGroup id ="panel">
<rich:dataTable id="apps" value="#{bean.apps}" var="app">
<!-- other columns not shown -->
<h:column>
<h:selectBooleanCheckbox id="admin" disabled="#{app.disabled}" value="#{app.value}">
<a4j:ajax event="click" execute="@this" render="panel">
</a4j:ajax>
</h:selectBooleanCheckbox>
</h:column>
</rich:dataTable>
</<h:panelGroup>
编辑1:
添加app.getValue
的伪代码:
public boolean getValue(){
if(check other instance variable value){
this.setValue(true);
}
}
答案 0 :(得分:0)
我可以通过以下技巧解决这个问题。单击复选框后,将调用后端方法,但在ajax请求完成后不会重新呈现页面。这节省了时间,第二个请求成功通过。这可以在复选框不需要重新渲染的情况下完成。
以下是有效的代码。
<h:column>
<!-- don't reRender -->
<h:selectBooleanCheckbox id="admin" disabled="#{app.disabled}" value="#{app.value}"
rendered="#{not app.reRender}">
<a4j:ajax event="click" execute="@this">
</a4j:ajax>
</h:selectBooleanCheckbox>
<!-- reRender -->
<h:selectBooleanCheckbox id="admin" disabled="#{app.disabled}" value="{app.value}"
rendered="#{app.reRender}">
<a4j:ajax event="click" execute="@this" render="panel">
</a4j:ajax>
</h:selectBooleanCheckbox>
</h:column>