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?
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.
Tags und Links jsf-2 primefaces