如何检查JSF / AjaxBehaviorEvent是否选中了多个复选框

问题描述 投票:0回答:2

我有多个复选框-在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对象吗?还是有其他方法?

ajax jsf
2个回答
0
投票

您可以使用valueChangeListener而不是listenerevent属性。每次您选中/取消选中复选框时,都会触发valueChangeListener

要在调用valueChangeListener时保留值,可以循环浏览postBacking.postsOverview.posts以查看是否检查了任何值。

不要忘记更新<f:ajax render="@form btnId"/>上的按钮以启用/禁用它。


0
投票

在处理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>
© www.soinside.com 2019 - 2024. All rights reserved.