Devo attivare un aggiornamento ajax dopo la modifica in una casella di testo, che è un componente <p:autoComplete>
. Ho osservato che se l'utente sceglie di digitare il testo manualmente, l'evento è una modifica, mentre se l'utente fa clic su uno dei suggerimenti per il completamento automatico, l'evento è itemSelect. Quindi ho aggiunto due input <p:ajax>
all'input, ognuno con lo stesso metodo e con lo stesso elenco di aggiornamenti, ma uno con event="change"
e l'altro event="itemSelect"
.Completamento automatico PrimeFaces: articoloSeleziona rispetto agli eventi di modifica
Tuttavia, ora scopro qualcosa di strano. Ad esempio, mentre nella normale modalità server ho aperto la mia pagina e digitato "12". Il completamento automatico ha offerto "1233" e "1234" come suggerimenti. Ho cliccato su "1233" e apparentemente non è successo niente. Ho fatto nuovamente clic e tutto il resto è stato completato.
Ripeti questo nel debugger con un punto di interruzione sul gestore eventi, e posso vedere che dopo il primo clic, il valore è "12" e al secondo clic, diventa "1233".
Selezionando le due diverse <p:ajax>
posso vedere le diverse conseguenze. Senza uno "change", il gestore non viene mai chiamato se l'utente seleziona un suggerimento di completamento automatico e senza lo strumento "itemSelect", il gestore non viene mai chiamato se l'utente digita manualmente. Ma con entrambi, ci sono due chiamate, e sono sicuro che ci saranno lamentele sul doppio clic.
Alcuni pseudo-codice per coloro che amano, in primo luogo l'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>
codice del bean Poi il Java backup:
public void idChangeEventListener() {
myBean = myDAO.getDetails(myBean);
// another couple of init-type method calls
}
Quando si utilizzano le versioni PrimeFaces più recenti dovrebbe essere "onstart =" if (PF ('widgetVarName'). Panel.is (': visible')) restituisce false; "' – mwalter