2013-02-07 10 views
9

Sto utilizzando la p:ajax listener per gestire gli eventi di modifica del valore (perché valueChangeListener viene lanciato sulla forma presentare): MetodoAjax per valueChangeListener

<p:ajax event="change" listener="#{bean.onNameChanged}"/> 

Maniglia:

public void onNameChanged(final AjaxBehaviorEvent event) 

Il problema è, io non è possibile trovare in AjaxBehaviorEvent né nella sua gerarchia di classi il posto dove leggere il valore vecchio dell'input. Né ho potuto trovare un suggerimento su google, come ottenere il vecchio valore ...

Come accedere al vecchio valore nell'evento p:ajax onChange?

risposta

15

Il problema è, non riesco a trovare nella AjaxBehaviorEvent né la sua gerarchia di classe il posto per leggere il vecchio valore dell'ingresso. Né ho potuto trovare suggerimento in google, come ottenere il vecchio valore ...

Utilizzare un valueChangeListener.


Purtroppo, valueChangeListener viene invocato prima di p: ajax, in modo da non avere dati reali provenienti da forme di tale metodo, quindi in teoria potrei usare valueChangeListener per ricordare il vecchio valore e quindi attendere p: ajax per elaborare ...

Accodare l'evento di modifica del valore alla fase di richiamo dell'applicazione.

public void valueChangeListenerMethod(ValueChangeEvent event) { 
    if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) { 
     event.setPhaseId(PhaseId.INVOKE_APPLICATION); 
     event.queue(); 
     return; 
    } 

    // Do your original job here. 
    // It will only be invoked when current phase ID is INVOKE_APPLICATION. 
} 
+4

+1, qualcuno dovrebbe fare il video di "BalusC IS AWESOME" (proprio come i video di "PEOPLE ARE AWESOME") – Daniel

+0

Bauke sei un ragazzo straordinario: D Mi hai appena risparmiato ore di grattarsi la testa. – xwinus

+2

Come al solito BalusC ha risolto il mio problema per me anni prima di averlo avuto. – Herick

3

Si potrebbe provare la seguente:

  1. Implementare l'evento di modifica valore nella vostra fagioli

    public void processValueChange(ValueChangeEvent e){ 
    //foo the bar 
    } 
    
  2. Definire un valueChangeListener sul componente selezione

    <p:selectOneMenu value="#{yourBean.value}" onchange="submit()" valueChangeListener="{#yourBean.processValueChange}"> 
    

    Il pezzo chiave è il submit() bit che elabora il modulo allegato al cambiamento del valore. È quindi possibile getNewValue() e getOldValue() secondo necessità.

EDIT: Ora che ci penso, non vedo alcun motivo per cui non si può lasciare l'impostazione così com'è e semplicemente definire il valueChangeListener. Dovrebbe essere ancora elaborato durante l'evento change nello <p:ajax/>, infatti, verrà elaborato prima del listener per l'evento ajax stesso.

+0

No, presentare non può essere fatto (a causa di convalida) e le modifiche devono essere visibili agli altri componenti dopo aver cambiato il campo, quindi non è una soluzione –

+0

@lechlukasz: È possibile eseguire una presentazione parziale come indicato nella sezione "EDIT" della risposta kolossus. Quindi verrà richiamato valueChangeListener e sarà possibile accedere al vecchio e al nuovo valore. Tutti gli altri elementi del modulo non saranno valutati/elaborati (a meno che non lo si inserisca nell'attributo 'execute' della chiamata ajax.) –

+0

Unfico, valueChangeListener è invocato prima di p: ajax, quindi non ho dati effettivi dai moduli in quel metodo, quindi in teoria potrei usare valueChangeListener per ricordare il vecchio valore e quindi attendere che p: ajax elaborasse ... –

5

Il ValueChangeListener dovrebbe funzionare in questo modo:

La vista:

<h:form> 
    <h:inputText value="#{sessionBean.hello}" 
       valueChangeListener="#{sessionBean.valueChangeListener}"> 
    <p:ajax/> 
    </h:inputText> 
</h:form> 

Il fagiolo:

public void valueChangeListener(ValueChangeEvent e) { 
    System.out.println("valueChangeListener invoked:" 
         + " OLD: " + e.getOldValue() 
         + " NEW: " + e.getNewValue()); 
} 

Il codice di cui sopra stamperà se cambio il campo di testo da "ciao" a "world":

valueChangeListener invocato: OLD: ciao NUOVO: mondo

+0

sai come rendere visibili anche le modifiche del bean al codice del server? con p: ajax ho l'opzione di processo, per inviare il contenuto del controllo dell'interfaccia utente, in questo modo sono in stato dall'ultimo invio ... –

+0

@lechlukasz: dai un'occhiata alla risposta di BalusC. –

0

è possibile utilizzare questo:

public void onNameChanged(AjaxBehaviorEvent event) 
{ 
    String myVal = (String) ((UIOutput) event.getSource()).getValue(); 
    System.out.println("myVal: " + myVal); 
} 
+1

L'OP è interessato al "** vecchio ** valore" com'era * prima della * fase di aggiornamento dei valori del modello. Il listener Ajax, tuttavia, esegue * dopo la fase di aggiornamento dei valori del modello di aggiornamento. Vedi la risposta attualmente accettata per l'approccio corretto. – BalusC