SelectOneMenu ajax events
Я использую редактируемые примитивы selectOneMenu для отображения некоторых значений. Если пользователь выбирает элемент из списка, необходимо обновить текстовое поле. Однако, если пользователь вводит что-то в selectOneMenu, текстовое поле не должно обновляться.
Я думал, что смогу работать с событием ajax. Однако я не знаю, какое событие я могу использовать здесь. Я знаю только событие valueChange
. Есть ли другие события, такие как onSelect
или onKeyUp
?
Вот мой код:
<p:selectOneMenu id="betreff" style="width: 470px !important;"
editable="true" value="#{post.aktNachricht.subject}">
<p:ajax event="valueChange" update="msgtext"
listener="#{post.subjectSelectionChanged}" />
<f:selectItems value="#{post.subjectList}" />
</p:selectOneMenu>
<p:inputTextarea style="width:550px;" rows="15" id="msgtext"
value="#{post.aktNachricht.text}" />
Ответы
Ответ 1
Непосредственные документированные события ajax в первичности очень плохо документированы, поэтому в большинстве случаев вы должны перейти к исходному коду и проверить себя.
p:selectOneMenu
поддерживает событие изменения:
<p:selectOneMenu ..>
<p:ajax event="change" update="msgtext"
listener="#{post.subjectSelectionChanged}" />
<!--...-->
</p:selectOneMenu>
который вызывает слушателя с AjaxBehaviourEvent
как аргумент в сигнатуре:
public void subjectSelectionChanged(final AjaxBehaviorEvent event) {...}
Ответ 2
Вы можете проверить, принадлежит ли значение вашего компонента selectOneMenu
к списку объектов.
А именно:
public void subjectSelectionChanged() {
// Cancel if subject is manually written
if (!subjectList.contains(aktNachricht.subject)) { return; }
// Write your code here in case the user selected (or wrote) an item of the list
// ....
}
Предположительно subjectList
- это тип коллекции, например ArrayList
. Конечно, здесь ваш код будет работать, если пользователь пишет элемент вашего списка selectOneMenu
.
Ответ 3
Следите за тем, чтобы страница не содержала пустого компонента с атрибутом "required" как "true" перед запуском компонента selectOneMenu.
Если вы используете такой компонент, как
<p:inputText label="Nm:" id="id_name" value="#{ myHelper.name}" required="true"/>
то
<p:selectOneMenu .....></p:selectOneMenu>
и забудьте заполнить требуемый компонент, ajax-прослушиватель selectoneMenu не может быть выполнен.