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它工作正常!为什么selectOneButton
在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>
我有一个类似的快照代码,这应该工作,这是我有的:
<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的主要内容,如果未能解决你的问题,请参考以下文章
Amazon CloudFront 未针对未更改的静态内容始终返回 304(未修改)?