JSF 2检查/取消选中h:selectBooleanCheckbox的列表

时间:2012-01-04 12:13:11

标签: jsf-2

我在ui:repeat中有一堆h:selectBooleanCheckboxs循环,我希望能够通过一次单击检查/取消选中所有这些。关注this这就是我尝试这样做的方法:

<h:selectBooleanCheckbox value="#{bean.selectAll}" valueChangeListener="#{bean.selectAllCustomers}">
    <f:ajax execute="@form" render="entireLoop"/>
</h:selectBooleanCheckbox>

循环:

<h:panelGroup id="entireLoop">  
  <ui:repeat var="customer" varStatus="status" value="#{bean.customers}">

    <tr> 
        <td>
    <h:selectBooleanCheckbox value="#{bean.customersMap[customer]}"/>
        </td>
      <td><h:commandLink value="#{customer.userID}" action="#{navBean.gotoEditCustomer(customer)}"/></td>
      <td>#{bean.getContact(user)}</td>
      <td>#{customer.companyName}</td>
      <td>#{customer.email}</td>
      <td>#{customer.phone}</td>
    </tr>       
  </ui:repeat>  
</h:panelGroup>

bean中的代码:

public void selectAllCustomers() {
    Iterator<User> keys = customersMap.keySet().iterator();
    while(keys.hasNext()) {
        User user = keys.next();
        customersMap.put(user, selectAll);
    }
}

当我点击查看“全选”复选框时,我遇到两个问题:

  1. 什么都没发生。只有当我点击页面中的其他位置时,才会调用该方法。我怎么能直接去?

  2. 整个循环从页面中消失。为什么? (我试图通过给它一个id或一个名字来让ajax只渲染selectBooleanCheckbox,但我收到一个错误,说这不是命名组件。)

1 个答案:

答案 0 :(得分:1)

如果您使用valueChangeListener标记的listener属性,则您的方法将起作用,而不是使用<f:ajax>。它会是这样的:

<h:selectBooleanCheckbox value="#{bean.selectAll}">
    <f:ajax listener="#{bean.selectAllCustomers}" render="entireLoop"/>
</h:selectBooleanCheckbox>

此外,您不需要使用execute="@form"提交整个表单。您只需提交selectAll属性并重新呈现entireLoop

如果您确实想使用valueChangeListener,则必须注意,在selectAll属性中应用新值之前,系统会触发您的方法。因此,在下一个请求之前,您的entireLoop将不会更新。要使用valueChangeListener,您的侦听器方法应如下所示:

public void selectAllCustomers(ValueChangeEvent e) {
    boolean newSelectAll = (Boolean) e.getNewValue();
    Iterator<Users> keys = customersMap.keySet().iterator();
    while(keys.hasNext()) {
        Users user = keys.next();
        customersMap.put(user, newSelectAll);
    }
}