2015-03-13 5 views
0

Я использую JSF 2 вместе с первичными, у меня есть selectOneButton, у которого есть 2 значения, EN/FR, я хочу получать уведомления каждый раз, когда язык изменяется, а затем изменить локаль на странице я установил valueChangeListener и событие ajax, , но каждый раз, когда прослушиватель изменений запускается, новое значение всегда равно нулю! здесь код XHTML:selectOneButton change listener всегда возвращает нуль

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

я даже пытался прикрепить к Аяксу слушателя:

<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?

UPDATE: Так я знаю, что является причиной этой проблемы на самом деле мой 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> 
+0

Это может также зависеть от Jsf фазы, в которой называется valueChangeListener. 'getLocalValue()' может работать. Попытайтесь, я никогда не использовал их. – Kukeltje

+0

, но локаль никогда не устанавливается в первую очередь? –

+0

Locale? И если вы попытаетесь извлечь его из 'submittedValue()'? – Kukeltje

ответ

0

вы могли бы попробовать

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

и удалить valueChangeListener из selectOneButton.

В languageChanged (событие AjaxBehaviorEvent) просто прочитайте новое значение из свойства language.

+0

Это тоже не сработало. –

+0

Я понял проблему, но не решение .. обновлено –

1

У меня есть похожая оснастка код и который должен работать, вот что у меня есть:

<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 componetent только для меня, чтобы знать, что делают или не в остальной части страницы, но вот метод:

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(), поэтому, может быть, мой пример помогает, у меня нет никаких аргументов, попробуйте без них первым, чтобы увидеть, если это помогает ,

+0

Я понял проблему, но не решение .. обновлено –

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> 

и в методе из фасоли:

public void changeLanguage() { 
System.out.println(languageName); 
} 
Смежные вопросы