版本:
RichFaces 4.3.5
Apache MyFaces 2.1
发行:
如下面的代码所示,我面临着在h:selectBoolenCheckbox
的一个列中使用的以下问题
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);
}
}
发布于 2014-06-19 11:45:22
我可以通过以下技巧来解决这个问题。单击复选框后,将调用后端方法,但在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>
https://stackoverflow.com/questions/24202882
复制相似问题