Autocompletar PrimeFaces: itemSelect versus change events
Necesito activar una actualización de ajax al cambiar a un cuadro de texto, que es un<p:autoComplete>
componente. He observado que si el usuario opta por escribir el texto manualmente, el evento es un cambio, mientras que si el usuario hace clic en una de las sugerencias para el autocompletado, el evento es itemSelect. Así que agregué dos<p:ajax>
de la entrada, cada uno llama al mismo método y tiene la misma lista de actualización, pero uno tieneevent="change"
y el otroevent="itemSelect"
.
Sin embargo, ahora descubro algo extraño. Por ejemplo, mientras estaba en modo servidor normal, abrí mi página y escribí "12". El autocompletado ofreció "1233" y "1234" como sugerencias. Hice clic en "1233" y aparentemente no pasó nada. Hice clic de nuevo y todo lo demás se completó.
Repita esto en el depurador con un punto de interrupción en el controlador de eventos, y puedo ver que después del primer clic, el valor es "12" y en el segundo clic, se convierte en "1233".
Cambiando comentando los dos diferentes.<p:ajax>
Puedo ver las diferentes consecuencias. Sin el cambio de "uno", nunca se llama al controlador si el usuario selecciona una sugerencia de autocompletar, y sin el "itemSelect", el controlador nunca se llama si el usuario escribe manualmente. Pero con ambos, hay dos llamadas, y estoy seguro de que habrá quejas sobre el doble clic.
Algunos pseudocódigo para aquellos que gustan, primero el 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>
Luego el código de soporte de Java:
public void idChangeEventListener() {
myBean = myDAO.getDetails(myBean);
// another couple of init-type method calls
}