我正在使用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}}
答案 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);
}