我有多个复选框-在xhtml视图代码中,它们具有相同的ID,即“选择”。
我为他们添加了一个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的侦听器方法中,我想检查是否选中了这些复选框中的任何一个,如果未标记任何复选框,则将按钮设置为禁用-如果设置了一个或多个,则将按钮设置为启用。
但是我如何掌握所有复选框的值?我可以为此使用AjaxBehaviorEvent对象吗?还是有其他方法?
您可以使用valueChangeListener
而不是listener
和event
属性。每次您选中/取消选中复选框时,都会触发valueChangeListener
。
要在调用valueChangeListener
时保留值,可以循环浏览postBacking.postsOverview.posts
以查看是否检查了任何值。
不要忘记更新<f:ajax render="@form btnId"/>
上的按钮以启用/禁用它。
在处理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(declined -> "No".equals(declined));
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>