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
}