Автозаполнение PrimeFaces: itemSelect против событий изменения

Мне нужно вызвать обновление AJAX при изменении текстового поля, которое является<p:autoComplete> составная часть. Я заметил, что если пользователь выбирает для ввода текста вручную, событие является изменением, тогда как если пользователь щелкает одно из предложений для автозаполнения, событие является itemSelect. Итак, я добавил два<p:ajax> дочерние элементы для ввода, каждый из которых вызывает один и тот же метод и имеет один и тот же список обновлений, но один имеетevent="change" и другиеevent="itemSelect".

Тем не менее, теперь я обнаружил нечто странное. Например, в обычном режиме сервера я открыл свою страницу и набрал «12». Автозаполнение предложило «1233» и «1234» в качестве предложений. Я нажал «1233» и, похоже, ничего не произошло. Я снова нажал, и все остальное заполнено.

Повторите это в отладчике с точкой останова на обработчике событий, и я вижу, что после первого щелчка значение равно «12», а при втором щелчке оно становится «1233».

Переключая комментируя два разных<p:ajax> Я вижу разные последствия. Без «изменения» обработчик никогда не вызывается, если пользователь выбирает предложение автозаполнения, а без «itemSelect» обработчик никогда не вызывается, если пользователь вводит вручную. Но с обоими из них есть два звонка, и я уверен, что будут жалобы на двойной щелчок.

Некоторый псевдокод для тех, кто любит, сначала XHTML:

<p:autoComplete id="itemId" value="#{myBacker.myBean.itemNumber}"
    required="true" completeMethod="#{myBacker.idAutoComplete}">
    <p:ajax event="itemSelect" update="beanDetails"
        listener="#{myBacker.idChangeEventListener()}" />
    <p:ajax event="change" update="beanDetails"
        listener="#{myBacker.idChangeEventListener()}" />
</p:autoComplete>
<h:panelGroup id="beanDetails">
    <h:panelGroup rendered="#{not empty myBacker.myBean.institutionName}">
        <h:outputText value="#{myBacker.myBean.institutionName}" />
        <!-- Continues with address, phone, etc..  -->
    </h:panelGroup>
</h:panelGroup>

Затем код бина Java:

public void idChangeEventListener() {
    myBean = myDAO.getDetails(myBean);
    //  another couple of init-type method calls
}

Ответы на вопрос(1)

Ваш ответ на вопрос