PrimeFaces Ajax Listener wird nicht ausgeführt, wenn das Prozessattribut für eine andere Komponente angegeben ist

8

Wenn ich das process -Attribut des p:ajax -Tags spezifiziere, wird der Listener nicht ausgeführt. Wenn ich das Attribut process weglasse, wird der Listener wie erwartet aufgerufen.

Hier ist das View-Snippet:

%Vor%

und Controller:

%Vor%

Ich habe eine phaseListener an eine Ansicht mit ANY_PHASE PhaseId angehängt, und hier ist das, was ich beobachtet habe.

Wenn ich das Attribut process festlege, wird der Wert der Eingabe inputToProcess während der Update-Modell-Phase erfolgreich auf den Controller gesetzt (es tritt keine Ausnahme auf). Dann werden die Phasen Invoke Application und Render Response ausgeführt, aber es wird kein Listener aufgerufen. Eine Sache, die mir aufgefallen ist, ist, dass das Kontrollkästchen am Ende nicht gesetzt ist. Aber es gibt keine Konvertierungs- oder Validierungsfehler, weil wie gesagt die Phasen Update Model und Invoke Application ausgeführt werden.

Wenn ich process -Attribut weglasse, sehe ich folgendes: Normalerweise wird der Listener während der Invoke Application -Phase aufgerufen (da immediate standardmäßig falsch ist), und dann wird 'Render Response' ausgeführt. Checkbox wurde erfolgreich eingestellt.

Gibt es eine Erklärung für diese Art von Verhalten?

    
jFrenetic 23.04.2012, 19:41
quelle

1 Antwort

15

Es sollte auf den ersten Blick gut funktionieren. Zumindest funktioniert das bei Verwendung von Standard-JSF-Komponenten. Ich würde wetten, dass es ein Fehler oder eine "Funktion" von PrimeFaces ist, dass es die Aktion nicht verarbeitet, wenn die Aktionskomponente nicht in process enthalten ist. Hinzufügen von @this zu process sollte es lösen. Erwäge, einen Problembericht an PrimeFaces-Jungs zu senden.

Außerdem würde ich lieber event="valueChange" oder event="click" anstelle von event="change" verwenden oder einfach die event komplett entfernen, es ist bereits der richtige Wert ( valueChange , der onclick im Kontrollkästchen anzeigt) und Optionsfeldkomponenten). Das change -Ereignis funktioniert in MSIE für Kontrollkästchen und Radiobuttons anders. Es wird nur beim 2. Klick ausgelöst. Sie möchten nicht vom Browser abhängig sein.

Laut Ihrem Kommentar:

  

Das Problem mit dem Standard-JSF-Kontrollkästchen und den Ajax-Komponenten ist, dass der Listener während der Prozessvalidierungsphase aufgerufen wird, aber ich muss das Modell zuerst aktualisieren!

Das ist nicht wahr. Wahrscheinlich hast du valueChangeListener anstelle von <f:ajax listener> benutzt oder den einen mit dem anderen verwechselt. Das <f:ajax listener> wird immer während der Aufrufaktionsphase aufgerufen.

    
BalusC 23.04.2012, 20:24
quelle

Tags und Links