Valuechangelistener Zweifel in JSF

7

HI,

Siehe den folgenden Code:

%Vor%

Backing Bean

%Vor%

Bitte lassen Sie mich wissen, ob die Implementierung korrekt ist. Es funktioniert gut. Meine Fragen sind:

  • Was ist der Vorteil des Hinzufügens des Tags f: valueChangeListener innerhalb des Tags h: selectOneMenu ? Ich habe das normale Attribut valueChangeListener="# {countryBean.changeCountry}" verwendet.
  • Ist es notwendig, onchange="submit () diesen Code zu verwenden, um die Werte zu ändern.
  • Was ist der Unterschied zwischen dem Schreiben der benutzerdefinierten Listener durch Implementieren der ActionListener-Schnittstelle und dem Verwenden des Attributs in den UIComponent-Tags (action="methodName")? Bitte erläutern Sie es mir.
Krishna 26.01.2011, 05:01
quelle

3 Antworten

20

ValueChangeListener wird nur aufgerufen, wenn das Formular gesendet wird, nicht wenn der Wert der Eingabe geändert wird. Wenn Sie diesen Listener dann ausführen möchten, wenn der Wert geändert wird, haben Sie zwei Lösungen:

  1. Reichen Sie Ihr Formular ein, wenn das onchange -Ereignis ausgelöst wird (das ist, was Sie in Ihrem Code getan haben);
  2. Verwenden Sie stattdessen einen Ajax-Aufruf, indem Sie einige dedizierte Komponenten verwenden (bereits in JSF2 integriert, mit <f:ajax> oder Bibliotheken von Drittanbietern wie Richfaces, Primefaces ...).

Hier ist ein Beispiel mit Richfaces:

%Vor%

In Bezug auf den Code Ihres Zuhörers scheint es richtig zu sein, aber warum ist Frage warum brauchen Sie hier einen ValueChangeListener ? In der Tat ist dieser Listener nützlich, wenn Sie eine Änderung eines Wertes verfolgen möchten. Deshalb stellt ValueChangeEvent sowohl getOldValue() als auch getNewValue() Methoden zur Verfügung.

In deinem Code interessiert dich der alte Wert nicht, also könntest du "einfach" eine Aktion anstelle von valueChangeListener (zB mit Richfaces) machen:

%Vor%

Schließlich besteht der Unterschied zwischen dem Attribut valueChangeListener und <f:valueChangeListener> darin, dass der erste eine Java-Methode ( #{myBean.myMethod} ) bindet, während der zweite eine Java-Klasse bindet ( type="com.foo.MyListenerClass" ), die ValueChangeListener implementiert. Schnittstelle. Also könnte der zweite allgemeiner sein als der erste ...

    
romaintaz 26.01.2011, 08:19
quelle
6

Romaintaz hat bereits am meisten darauf hingewiesen, ich wollte nur direkt auf Ihre konkreten Fragen eingehen:

  

Was ist der Vorteil des Hinzufügens des Tags f: valueChangeListener im Tag h: selectOneMenu? Ich habe das normale Attribut valueChangeListener="# {countryBean.changeCountry}" verwendet.

Wie Romaintaz sagte, zeigt das Attribut auf eine Methode und das f: -Tag verweist auf eine Klasse. Ein weiterer Vorteil ist, dass Sie mehrere von ihnen haben können, wann immer das notwendig ist.

  

Ist es notwendig, onchange="submit () diesen Code zu verwenden, um die Werte zu ändern.

Dass Javascript die Werte nicht ändert. Dadurch, dass Javascript das gesamte Formular absendet, ohne dass Sie den Senden-Button selbst drücken müssen, wenn der Wert vom Endbenutzer geändert wurde. Nein, das ist nicht nötig. Sie können es auch einfach entfernen und erwarten, dass der Endbenutzer die Übermittlungsschaltfläche selbst drückt. Noch einmal , dass JavaScript nicht Teil von JSF ist.

  

Was ist der Unterschied zwischen dem Schreiben der benutzerdefinierten Listener durch Implementieren der ActionListener-Schnittstelle und dem Verwenden des Attributs in den UIComponent-Tags (action="methodName").

Diese Frage wurde bereits zuvor gestellt: Unterschied zwischen Aktion und actionlistener .

    
BalusC 26.01.2011 11:58
quelle
0

Die Lösung von romaintaz, eine Aktion anstelle von valueChangeListener aufzurufen, ist auch großartig, weil die Aktion im Fall des "change" -Ereignisses aufgerufen wird, nachdem das Modell aktualisiert wurde (z. B. für eine Datenbankaktualisierung), während der valueChangeListener zuvor aufgerufen wird ....

    
Manu de Hanoi 22.06.2012 10:35
quelle

Tags und Links