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

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}" />
4b9b3361

Ответ 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 не может быть выполнен.