2013-09-04 12 views
6

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 
} 

risposta

9

Dare il tag genitore un attributo widgetVar, quindi aggiungere questa piccola attributo al tag <p:ajax event="change" ...> bambino:

onstart="if(widgetVarName.panel.is(':visible')) return false;" 

Quando la questione è stato scritto, eravamo in PrimeFaces versione 3.5, se ricordo correttamente. Da allora, dobbiamo aggiornare la soluzione a:

onstart="if(PF('widgetVarName').panel.is(':visible')) return false;" 

con grazie a mwalter per indicare il cambiamento.

+2

Quando si utilizzano le versioni PrimeFaces più recenti dovrebbe essere "onstart =" if (PF ('widgetVarName'). Panel.is (': visible')) restituisce false; "' – mwalter

Problemi correlati