Как мне заставить PrimeFaces <p: selectOneMenu> вызвать valueChangeListener?
Использование снимка 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>
У слушателя в компоненте поддержки есть оператор print, который не вызывается (по крайней мере, я не вижу его в журнале сервера).
Есть ли что-то еще, что мне нужно сделать, чтобы вызвать valueChangeListener для вызова при изменении значения? Нужно ли использовать?
Кроме того, в слушателе, есть ValueChangeEvent, который передается?
Благодарю.
2 ответа
Вы, кажется, ожидаете, что 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 и плохо для пользователя. Он также будет отправлять (и конвертировать / проверять!) Все остальные поля ввода, которые могут не соответствовать вашим требованиям.
Вместо этого используйте прослушиватель 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
аргумент.
Добавьте оператор 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"/>