与h:selectBooleanCheckbox的JSF2 AJAX问题

时间:2014-06-13 10:10:27

标签: ajax jsf-2 richfaces

版本:

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);    
    }

} 

1 个答案:

答案 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>