selectOneButton更改侦听器始终返回null

时间:2015-03-13 02:12:35

标签: ajax jsf primefaces

我正在使用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内,当我将selectOneButton排除在splitButton外时,它工作正常! 为什么menuItem位于<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> 内部,阻止它将其发送到服务器? 这里是代码:

{{1}}

3 个答案:

答案 0 :(得分:2)

我有一个类似的快照代码,应该可以使用,这就是我所拥有的:

<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()的值时,所以也许我的例子有帮助,我没有参数,先试试看它是否有帮助。

答案 1 :(得分:0)

你能试试吗

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

并从selectOneButton中删除valueChangeListener。

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

答案 2 :(得分:0)

<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);
}