Автозаполнение 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
}