2012-04-23 9 views
8

Quando si specifica l'attributo process del tag p:ajax, il listener non viene eseguito. Se ometto l'attributo process, il listener viene chiamato come previsto.PrimeFaces Ajax Listener non eseguito quando l'attributo di processo è specificato per un componente diverso

Ecco il frammento di vista:

<p:messages id="messages" /> 
<h:inputText id="inputToProcess" value="#{controller.inputToProcess}" /> 
<p:selectBooleanCheckbox id="testCheckbox" > 
    <p:ajax event="change" process="inputToProcess" 
    update="messages @this inputToUpdate" 
    listener="#{controller.processChecked}" /> 
</p:selectBooleanCheckbox> 
<h:inputText id="inputToUpdate" value="#{controller.inputToUpdate}" /> 

e regolatore:

@javax.faces.bean.ManagedBean 
@javax.faces.bean.ViewScoped 
public class Controller implements Serializable { 
    private String inputToProcess; 
    private String inputToUpdate; 
    //getters and setters 

    public void processChecked(javax.faces.AjaxBehaviorEvent e) { 
    // doing some stuff here 
    } 
} 

Ho attaccato un phaseListener ad una vista con ANY_PHASEPhaseId, e qui è quello che ho osservato.

Quando specifico process attributo, il valore del ingresso inputToProcess è impostato con successo al controller durante la fase di aggiornamento del modello (non si verifica alcuna eccezione). Quindi vengono eseguite le fasi e Render Response, ma nessun listener viene chiamato. Una cosa che ho notato è che la casella di controllo non è impostata alla fine. Ma non ci sono errori di conversione o di convalida, perché come ho detto le fasi Update Model e vengono eseguite.

Se tralascio attributo process, qui è quello che vedo: l'ascoltatore è normalmente chiamato durante la fase di Invoke Application (dal immediate è falso di default), e poi `Render Response viene eseguita. La casella di controllo è stata impostata correttamente.

C'è qualche spiegazione per questo tipo di comportamento?

+0

Cosa succede se si aggiunge '@ questo' a' processo'? Cosa succede se si utilizza la casella di controllo JSF standard e componenti ajax invece di quelli PrimeFaces? – BalusC

+0

@BalusC Sono stanco contando quante volte mi avete aiutato. Grazie mille! L'aggiunta di '@ this' a' process' ha funzionato per me. Sei in grado di spiegare perché? Ho pensato che il 'listener' dovrebbe essere attivato, non importa, se' @ this' è specificato in 'process' o no. Questo potrebbe essere un problema? Il problema con la casella di controllo JSF standard e i componenti ajax è che il listener viene richiamato durante la fase di 'Process Validations', ma prima devo aggiornare il modello! Chiunque, posta questa come risposta, lo accetterei volentieri. – jFrenetic

+0

È stato aggiunto un problema a: https://github.com/primefaces/primefaces/issues/509, ma purtroppo non lo vogliono risolvere. Per favore, entra e commenta e vota. – GreenieMeanie

risposta

15

Dovrebbe funzionare bene a prima vista. Almeno, funziona in questo modo quando si utilizzano componenti JSF standard. Scommetto che si tratta di un bug o di "funzionalità" di PrimeFaces che non elabora l'azione quando il componente di azione non è incluso nello process. L'aggiunta di @this a process dovrebbe risolverlo. Prendi in considerazione la possibilità di pubblicare un rapporto sul problema a PrimeFaces.

Inoltre, io preferisco usare event="valueChange" o event="click" invece di event="change" o semplicemente rimuovere la event del tutto, per impostazione predefinita il giusto valore già (valueChange che renderà onclick nei componenti casella di controllo e pulsanti di opzione). L'evento change funziona in modo diverso in MSIE per le caselle di controllo e i pulsanti di opzione. Viene attivato solo al secondo clic e al successivo. Non vuoi essere dipendente dal browser.


Secondo il vostro commento:

Il problema con i componenti casella di controllo e Ajax JSF standard, è che l'ascoltatore viene richiamato durante il processo di fase di convalide, ma ho bisogno di aggiornare il modello prima!

Questo non è vero. Probabilmente stavi usando valueChangeListener invece di <f:ajax listener> o confondendo l'uno con l'altro. Il <f:ajax listener> viene sempre richiamato durante la fase di azione invoke.

+0

Eccellente! Avevi ragione, ho usato 'valueChangeListener'. Un'ultima domanda. Con 'f: ajax', quale evento dovrei specificare? O è predefinito al valore giusto e con 'p: ajax'? – jFrenetic

+2

Sì, lo fa. L'impostazione predefinita è sempre 'event =" valueChange "' per i componenti 'UIInput' e' event = "action" 'per i componenti' UICommand'. Sui componenti 'UIInput' tradurrà in' change' per gli elementi HTML input/select/textarea e 'click' per gli elementi HTML radiobox/checkbox. – BalusC

+1

Sebbene 'process' sia impostato su' @ this' come descritto nella documentazione di Primefaces, '@ this' è sorprendentemente non elaborato se si hanno altri id dei componenti in' process'. –

Problemi correlati