2013-02-07 6 views
9

Ich bin mit dem p:ajax Zuhörer Wertänderung Ereignisse zu behandeln (weil valueChangeListener auf Formular gestartet wird):Ajax für valueChangeListener

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

Handle-Methode:

public void onNameChanged(final AjaxBehaviorEvent event) 

Das Problem ist, ich kann in AjaxBehaviorEvent noch seine Klassenhierarchie die Stelle finden, um den alten Wert des Eingangs zu lesen. Weder konnte ich einen Hinweis in Google finden, wie man den alten Wert bekommt ...

Wie auf den alten Wert im p:ajax onChange Ereignis zuzugreifen?

Antwort

15

Das Problem ist, dass ich nicht in AjaxBehaviorEvent noch seine Klassenhierarchie den Platz findet, kann den alten Wert des Eingangs zu lesen. Weder kann ich finde Hinweis in Google, wie den alten Wert erhalten ...

ein valueChangeListener verwenden.


Unfortunatelly wird valueChangeListener vor p aufgerufen: Ajax, so habe ich keine echten Daten aus Formularen in diesem Verfahren, so in der Theorie ich valueChangeListener verwenden könnte den alten Wert zu erinnern, und dann warten, p: ajax to process ...

Warteschlange das Wertänderungsereignis in die Anwendungsphase aufrufen.

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, Jemand sollte "BalusC IS AWESOME" -Video machen (genau wie "PEOPLE ARE AWESOME" -Videos) – Daniel

+0

Bauke du bist toller Typ: D Du hast mir gerade Stunden Kopf kratzen erspart. – xwinus

+2

Wie üblich hat BalusC mein Problem jahrelang gelöst, bevor ich es hatte. – Herick

3

Sie könnten versuchen, die folgenden:

  1. den Wert Änderungsereignis Implementieren in Ihrem Bean

    public void processValueChange(ValueChangeEvent e){ 
    //foo the bar 
    } 
    
  2. eine valueChangeListener auf Ihre Auswahl Komponente definieren

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

    Das Schlüsselstück dort ist das submit() Bit, das das umschließende Formular bei Änderung des Wertes verarbeitet. Sie können dann getNewValue() und getOldValue() wie erforderlich.

EDIT: Nun, da ich darüber nachdenke, sehe ich keinen Grund, warum Sie nicht Ihr Setup verlassen kann, wie sie ist und einfach die valueChangeListener definieren. Es sollte noch während des Ereignisses in der <p:ajax/> verarbeitet werden, tatsächlich wird es vor dem Listener für das Ajax-Ereignis selbst verarbeitet.

+0

Nein, einreichen kann nicht (wegen der Validierung) durchgeführt werden und die Änderungen müssen an anderen Komponenten sichtbar sein, nachdem das Feld zu ändern, so dass es keine Lösung ist) –

+0

@lechlukasz: Sie können eine teilweise Submit wie in der "EDIT" -Part von Kolossus Antwort angegeben tun. Dann wird der valueChangeListener aufgerufen und Sie können auf den alten und den neuen Wert zugreifen. Alle anderen Formularelemente werden nicht ausgewertet/verarbeitet (es sei denn, Sie geben es in das Attribut 'execute' des Ajax-Aufrufs ein.) –

+0

Leider wird valueChangeListener vor p: ajax aufgerufen, daher habe ich keine tatsächlichen Daten von Formularen Methode, so in der Theorie konnte ich valueChangeListener verwenden, um den alten Wert zu erinnern und dann auf p: ajax zu warten, um zu verarbeiten ... –

5

Die ValueChangeListener sollte so funktionieren:

Aussicht:

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

Die Bohne:

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

Der obige Code wird gedruckt, wenn ich das Textfeld von "Hallo" ändern zu "Welt":

valueChangeListener aufgerufen: OLD: hallo NEU: Welt

+0

Wissen Sie, wie auch die Bean-Änderungen für den Servercode sichtbar gemacht werden? mit p: ajax Ich habe die Prozess-Option, um den Inhalt der UI-Kontrolle zu senden, auf diese Weise sind sie im Zustand vom letzten reichen ... –

+0

@lechlukasz: Werfen Sie einen Blick auf BalusC's Antwort. –

0

können Sie verwenden:

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

OP interessiert sich für den "** alten ** Wert", wie er * vor * Aktualisierung der Modellwerte-Phase stattgefunden hat. Der Ajax-Listener läuft jedoch * nach * Update Model Values ​​Phase. Siehe die derzeit akzeptierte Antwort für den richtigen Ansatz. – BalusC