PrimeFaces-Autovervollständigung: ItemSelect versus Change-Ereignisse

Ich muss ein Ajax-Update auslösen, wenn ich ein Textfeld ändere<p:autoComplete> Komponente. Ich habe festgestellt, dass das Ereignis eine Änderung darstellt, wenn der Benutzer den Text manuell eingibt, während das Ereignis itemSelect lautet, wenn der Benutzer auf einen der Vorschläge für die automatische Vervollständigung klickt. Also habe ich zwei hinzugefügt<p:ajax> untergeordnete Elemente für die Eingabe, wobei jedes die gleiche Methode aufruft und dieselbe Aktualisierungsliste hat, eines jedochevent="change" und der andereevent="itemSelect".

Jetzt entdecke ich jedoch etwas Seltsames. Im normalen Servermodus habe ich beispielsweise meine Seite geöffnet und "12" eingegeben. Die Autovervollständigung bot "1233" und "1234" als Vorschläge an. Ich habe auf "1233" geklickt und anscheinend ist nichts passiert. Ich klickte erneut und alles andere füllte aus.

Wiederholen Sie dies im Debugger mit einem Haltepunkt auf dem Ereignishandler, und ich kann sehen, dass der Wert nach dem ersten Klick "12" ist und beim zweiten Klick "1233" wird.

Durch das Auskommentieren wechseln sich die beiden ab<p:ajax> Ich kann die verschiedenen Konsequenzen sehen. Ohne "change" wird der Handler niemals aufgerufen, wenn der Benutzer einen Vorschlag zur automatischen Vervollständigung auswählt, und ohne "itemSelect" wird der Handler niemals aufgerufen, wenn der Benutzer manuell eingibt. Aber bei beiden gibt es zwei Anrufe, und ich bin sicher, dass es Beschwerden über den Doppelklick geben wird.

Einige Pseudo-Code für diejenigen, die zunächst die xhtml mögen:

<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>

Dann der Java Backing Bean Code:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage