Как мне заставить PrimeFaces <p: selectOneMenu> вызывать valueChangeListener? - PullRequest
14 голосов
/ 07 декабря 2011

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

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

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

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

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

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

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

Спасибо.

Ответы [ 2 ]

35 голосов
/ 07 декабря 2011

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

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

  1. Добавьте 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 и плохо для пользовательского опыта. Он также будет отправлять (и конвертировать / проверять!) Все остальные поля ввода, которые могут быть не такими, как вы хотите.

  2. Вместо этого используйте прослушиватель ajax, если вы не заинтересованы в фактическом изменении значения (т. Е. Старое значение вам не интересно), но на самом деле вас интересует само событие change. Вы можете сделать это, используя <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.

3 голосов
/ 18 декабря 2011

Добавьте оператор 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>

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

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