我在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);
}
}
当我点击查看“全选”复选框时,我遇到两个问题:
什么都没发生。只有当我点击页面中的其他位置时,才会调用该方法。我怎么能直接去?
整个循环从页面中消失。为什么? (我试图通过给它一个id或一个名字来让ajax只渲染selectBooleanCheckbox,但我收到一个错误,说这不是命名组件。)
答案 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);
}
}