我有多个复选框-它们在xhtml视图代码中被赋予相同的id"choosen"。
我为他们添加了一个Ajax事件监听器,如下所示:
<ui:repeat var="posts"
value="#{postBacking.postsOverview.posts}">
<h:selectBooleanCheckbox id="choosen"
styleClass="check-margin"
value="#{posts.choosen}" rendered="#{posts.declined =='No'}">
<f:ajax listener="#{postsBacking.isPostsChosen}" event="click" render="@form" execute="@form"/>
</h:selectBooleanCheckbox>
</ui:repeat>
在我的backingBean中的listener方法中,我想检查是否选中了这些复选框中的任何一个,然后如果没有标记复选框,则将按钮设置为禁用,如果设置了一个或多个复选框则将按钮设为启用。
但是,我如何获取所有复选框的值?我可以使用AjaxBehaviorEvent对象吗?或者有其他方法吗?
在处理ajax事件侦听器时,复选框值通常应该应用于您的数据模型,您可以在其中查找用户选择的状态。根据该状态,只需切换一个禁用命令按钮的布尔bean属性:
@Named
@ViewScoped
public class MyBean implements Serializable {
private List<Post> posts;
private boolean buttonDisabled = true;
public void ajaxEventListener(BehaviorEvent e) {
boolean anythingChosen = false;
for (Post post : posts) {
if (post.isChosen() && "No".equals(post.getDeclined())) {
anythingChosen = true;
break;
}
}
// or alternatively using the stream api:
// anythingChosen = posts.stream().filter(Post::isChosen).map(Post::getDeclined)
// .anyMatch("No"::equals);
setButtonDisabled(!anythingChosen);
}
// getters, setters ...
}
使用以下表格,只要没有选中复选框,命令按钮就会被禁用:
<h:form>
<ui:repeat var="post" value="#{myBean.posts}">
<h:selectBooleanCheckbox value="#{post.chosen}">
<f:ajax event="click" listener="#{myBean.ajaxEventListener}" render="@form" execute="@form"/>
</h:selectBooleanCheckbox>
</ui:repeat>
<h:commandButton action="#{myBean.doSomething()}" value="doSomething"
disabled="#{myBean.buttonDisabled}" />
</h:form>
您可以使用valueChangeListener
,而不是使用listener
和event
属性。每次选中/取消选中复选框时,都会触发valueChangeListener
要在调用valueChangeListener
时获取值,可以循环使用postBacking.postsOverview.posts
查看是否检查了任何值
不要忘记更新<f:ajax render="@form btnId"/>
上的按钮以启用/禁用它。