Preenchimento automático de PrimeFaces: itemSelecione versus eventos de alteração

Preciso acionar uma atualização ajax após a alteração para uma caixa de texto, que é um<p:autoComplete> componente. Observei que, se o usuário optar por digitar o texto manualmente, o evento será uma alteração, enquanto se o usuário clicar em uma das sugestões para o preenchimento automático, o evento será itemSelecionar. Então eu adicionei dois<p:ajax> filhos para a entrada, cada um chamando o mesmo método e tendo a mesma lista de atualização, masevent="change" e o outroevent="itemSelect".

No entanto, agora descubro algo estranho. Por exemplo, enquanto no modo de servidor normal eu abri minha página e digitei "12". O autocomplete ofereceu "1233" e "1234" como sugestões. Eu cliquei em "1233" e aparentemente nada aconteceu. Eu cliquei novamente e tudo mais foi preenchido.

Repita isso no depurador com um ponto de interrupção no manipulador de eventos, e posso ver que, após o primeiro clique, o valor é "12" e, no segundo clique, ele se torna "1233".

Ao mudar comentando os dois diferentes<p:ajax> Eu posso ver as diferentes conseqüências. Sem o "alterar", o manipulador nunca é chamado se o usuário selecionar uma sugestão de preenchimento automático e, sem a opção "itemSelect", o manipulador nunca é chamado se o usuário digitar manualmente. Mas, com os dois, há duas ligações e tenho certeza de que haverá reclamações sobre o clique duplo.

Algum pseudo-código para aqueles que gostam, primeiro o 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>

Em seguida, o código do bean de apoio Java:

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

questionAnswers(1)

yourAnswerToTheQuestion