selectOneButton更改侦听器始终返回null

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selectOneButton更改侦听器始终返回null相关的知识,希望对你有一定的参考价值。

我正在使用JSF 2和primefaces,我有一个selectOneButton,它有2个值,EN / FR,我希望每次更改语言时都会收到通知,然后更改页面的语言环境,我设置了valueChangeListener和ajax事件,但每次触发更改侦听器时,新值始终为null!这是xhtml代码:

<h:form id="f">
<p:selectOneButton id="lang" value="#{currentUser.language}" valueChangeListener="#{currentUser.languageChanged}" >
    <f:selectItem itemLabel="English" itemValue="en" />
    <f:selectItem itemLabel="Françcais" itemValue="fr" />
    <f:ajax event="change"/>
</p:selectOneButton>
</h:form>

languageChanged测试方法:

public void languageChanged(ValueChangeEvent event) {
        System.out.println("new val: " + event.getNewValue());
        System.out.println("old val: " + event.getOldValue());
    }

我甚至试图将ajax附加到听众身上:

<f:ajax event="change" listener="#{currentUser.languageChanged}"/>

和方法:

public void languageChanged(AjaxBehaviorEvent event) {
        SelectOneButton button = (SelectOneButton)event.getComponent(); 
        System.out.println(button.getValue())   ;
    }

这是从p:selectOneButton中使用ajax检索新选定值的错误方法吗?

更新:所以我知道是什么导致这个问题实际上我的selectOneButton是在menuItem里面的splitButton,当我把selectOneButton带出splitButton它工作正常!为什么selectOneButtonmenuItem内阻止它发送到服务器?这里的代码:

<h:panelGroup style="float: right;" > 
    <h:form id="f">
        <p:splitButton value="#{currentUser.fullName}" icon="ui-icon-person" styleClass="toTheRight" style="min-width: 200px;" >
            <p:menuitem value="Matricule: #{currentUser.matricule}"  />
            <p:menuitem value="#{msgs.role}: #{currentUser.role}" />
            <p:separator />
            <p:menuitem>
                <p:selectOneButton id="lang" value="#{currentUser.language}" valueChangeListener="#{currentUser.languageChanged}" >
                    <f:selectItem itemLabel="English" itemValue="en" />
                    <f:selectItem itemLabel="Françcais" itemValue="fr" />
                    <f:ajax event="change"/>
                </p:selectOneButton>
            </p:menuitem>
            <p:separator />
            <p:menuitem value="#{msgs.settings}" icon="ui-icon-wrench"  />
            <p:menuitem value="#{msgs.logout}"  icon="ui-icon-arrowthickstop-1-w" url="/j_spring_security_logout"/>
        </p:splitButton>
    </h:form>
</h:panelGroup>
答案

我有一个类似的快照代码,这应该工作,这是我有的:

<p:outputLabel for="scriptMigrate" value="Migrate" style="font-weight:bold" />
<p:selectOneButton id="scriptMigrate" value="#{scriptConfiguration.scriptMigrate}" required="true">                          
    <f:selectItem itemLabel="Yes" itemValue="1" />
    <f:selectItem itemLabel="No" itemValue="0" />
    <p:ajax update="fsstobe" event="change" listener="#{scriptConfiguration.updateForm()}" />
</p:selectOneButton>

update组件只是让我知道在页面的其余部分呈现或不呈现的内容,但这里是方法:

public void updateForm() {
    System.out.println("entered with value: " + scriptMigrate);
    if (scriptMigrate.equals("1")) {
        renderScriptAsIs = true;
    }
    if (scriptMigrate.equals("0") || scriptMigrate.equals("")) {
        renderScriptAsIs = false;
    }
}

所以我假设当你改变你想要调用方法languageChanged()的值时,所以也许我的例子有帮助,我没有参数,先试试看它是否有帮助。

另一答案

你能试试吗?

<p:ajax listener="#{currentUser.languageChanged}"/>

并从selectOneButton中删除valueChangeListener。

在languageChanged(AjaxBehaviorEvent事件)中,只需从language-property中读取新值。

另一答案
<p:selectOneButton value="#{languageBean.languageName}">
                <p:ajax listener="#{languageBean.changeLanguage()}" partialSubmit="true"/>
                <f:selectItem itemLabel="DE" itemValue="#{CONST.LANGUAGE_DE}"/>
                <f:selectItem itemLabel="EN" itemValue="#{CONST.LANGUAGE_EN}" />
</p:selectOneButton>

并在bean的方法中:

public void changeLanguage() {
System.out.println(languageName);
}

以上是关于selectOneButton更改侦听器始终返回null的主要内容,如果未能解决你的问题,请参考以下文章

Java SWT 创建侦听器以更改标签的文本并返回数据

Firebase 侦听器或下拉刷新

Amazon CloudFront 未针对未更改的静态内容始终返回 304(未修改)?

尝试在更改的路由 vue 上记录到本地存储时,indexof() 始终返回 -1

CheckBoxTableCell 更改侦听器不起作用

区分 Firestore 中的第一次查询快照和更改侦听器