Подтвердить что ты не робот

Как мне получить PrimeFaces <p: selectOneMenu> для вызова valueChangeListener?

Использование снимка PF 3.0-RC1 (11/22/2011)

У меня есть составной компонент. Я хочу вызвать valueChangeListener, когда выбор сделан, но, похоже, он не вызывает слушателя.

Вот код для компонента:

<p:selectOneMenu style="width: 220px;" 
         value="#{customerProfileSessionBean.selectedAccount}"
         valueChangeListener="#{customerProfileSessionBean.accountValueChange}" >
    <f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>

У слушателя в резервной копии bean есть оператор печати, который не вызывается (по крайней мере, я не вижу его в журнале сервера).

Есть ли что-то еще, что мне нужно сделать, чтобы вызвать функцию valueChangeListener при изменении значения? Нужно ли использовать?

Кроме того, в прослушителе есть передаваемый ValueChangeEvent?

Спасибо.

4b9b3361

Ответ 1

Кажется, вы ожидаете, что метод valueChangeListener на стороне сервера вызывается немедленно, когда событие изменения происходит на стороне клиента. Это неверно. Он будет вызываться только тогда, когда форма отправлена ​​ на сервер, а новое значение не equals() старое значение.

Существует как минимум два способа достижения вашего функционального требования:

  • Добавьте onchange="submit()", чтобы JavaScript передавал форму всякий раз, когда вы меняете значение:

    <p:selectOneMenu style="width: 220px;" 
       value="#{customerProfileSessionBean.selectedAccount}"
       valueChangeListener="#{customerProfileSessionBean.accountValueChange}"
       onchange="submit()">
        <f:selectItems value="#{sessionBean1.custAccountList}"/>
    </p:selectOneMenu>
    

    Это, однако, очень JSF-1.x-ish и плохо для пользователей. Он также будет отправлять (и конвертировать/проверять!) Все другие поля ввода, которые могут быть не такими, какие вы хотите.

  • Вместо этого используйте прослушиватель ajax, наверняка, если вас не интересует фактическое изменение значения (т.е. старое значение вам не интересно), но вы действительно заинтересованы в самом событии изменения. Вы можете сделать это с помощью <f:ajax> или в компонентах PrimeFaces с помощью <p:ajax>:

    <p:selectOneMenu style="width: 220px;" 
       value="#{customerProfileSessionBean.selectedAccount}">
        <p:ajax listener="#{customerProfileSessionBean.accountValueChange}" />
        <f:selectItems value="#{sessionBean1.custAccountList}"/>
    </p:selectOneMenu>
    

    И замените аргумент ValueChangeEvent аргументом AjaxBehaviorEvent.

Ответ 2

Добавьте f: оператор ajax для p: selectOneMenu, он создаст ajax-вызов, и ваше значение будет отправлено EX:

      <p:selectOneMenu style="width: 220px;" value="#  
      {customerProfileSessionBean.selectedAccount}"
             valueChangeListener="#{customerProfileSessionBean.accountValueChange}" >
      <f:selectItems value="#{sessionBean1.custAccountList}"/>
       <f:ajax render="@form"/>
       </p:selectOneMenu>

Или вы можете указать идентификатор панели или идентификатор datatable, если вы не хотите, чтобы torender всей формы, например:

    <f:ajax render=":formid:panelGroupId"/>