Tut mir leid, wenn ich dick bin, aber was ist das execute="@ all" in einem f: ajax tag eigentlich? Ich erwartete, dass es alle Elemente auf einer Seite übergibt, aber es scheint, nur die Werte in der umschließenden Form, nicht alle Formulare auf Seite zu senden.
Zum Beispiel
%Vor%Nur form2 wird beim Klick gepostet.
Verwenden von mojarra 2.0.2 ..
Die execute="@all"
war nur ein Hauptversehen beim Entwerfen der JSF2-Spezifikation. JSF abstrahierte zu sehr von seiner HTML-basierten Form und vergaß dabei, dass es letztendlich tatsächlich ein HTML-Code-Generator ist.
In HTML muss ein anderes Formular als das umgebende Formular eingereicht werden < stark> nicht erlaubt . So wird execute="@all"
aus dieser Perspektive niemals funktionieren. Es verhält sich genauso wie execute="@form"
. Da JSF nur ein HTML-Code-Generator ist, wird das gleiche "Problem" auch JSF betreffen. Es ist nicht möglich, mehrere <h:form>
-Komponenten gleichzeitig zu verarbeiten.
Wenn Sie diese Funktion aus irgendeinem Grund wirklich benötigen, sollten Sie einen Schritt zurückgehen und die falsche Betrachtungsweise von HTML-Formularen überdenken. Sie müssen sicherstellen, dass Ihre Formulare so gestaltet sind, dass Sie niemals Informationen von einem anderen Formular benötigen.
PrimeFaces hat bereits früh erkannt, dass @all
grundsätzlich falsch ist . Das ist genau der Grund, warum sie nie @all
in process
-Attribut unterstützt haben, ihr Äquivalent von execute
. Sie unterstützten anfangs auch nie @all
in update
, deren Äquivalent von render
. Allerdings war der einzige reale Anwendungsfall, bei dem dies sinnvoll war, der Umgang mit einer vollständigen Fehlerseite während einer Ajax-Ausnahme, sodass sie update="@all"
schließlich zurückbrachten, nachdem ich die FullAjaxExceptionHandler
. % Co_de% hat immer noch genau den gleichen Effekt wie process="@all"
.
Die gleiche PrimeFaces-Bibliothek hat jedoch unbeabsichtigt auch das imaginäre Verhalten von process="@form"
über ihre später eingeführten execute="@all"
partialSubmit="true"
dient nur der Vereinfachung, eine hardcodierte Sammlung wie @(form)
usw. ist auch nur möglich).
Dies funktioniert, weil :formId1 :formId2 :formId3
die partialSubmit="true"
auf der Clientseite anstatt auf der Serverseite vorbereitet. Mit anderen Worten, anstatt das gesamte umschließende Formular vom Server zum Client zu senden und dann die angegebenen Eingaben zu verarbeiten, sendet es nur die angegebenen Eingaben vom Server zum Client und verarbeitet sie dann alle. Beachten Sie, dass, wenn process="xxx"
abwesend oder auf partialSubmit
festgelegt ist, es immer noch nur das umschließende Formular sendet. Auf dieses Fehlverhalten sollte man sich eher nicht verlassen. Sie können dieses Fehlverhalten früher oder später auf ihrer Seite beheben.
Hier finden Sie ein Zitat von JavaServer Faces 2.0 - Die vollständige Referenz , Seite 352:
Die Schlüsselwörter execute und rendering akzeptieren eine Reihe von speziellen Schlüsselwörtern mit den in dieser Tabelle angegebenen Bedeutungen:
@all (Verwendung mit
execute
): Jede Komponente auf der Seite ist eingereicht und verarbeitet . Dies ist nützlich, wenn Sie eine vollständige Seite senden möchten.
Ich denke, das sagt ganz klar, dass die Felder aus allen Formen mit der AJAX-Anfrage eingereicht werden sollten.
Aber selbst mit Mojarra 2.0.3 passiert das nicht. Trotz des Inhalts des execute
-Attributs (unabhängig davon, ob Sie eine Liste von Formularen oder @all
angeben) wird nur das umschließende Formular mit seinen Feldern ausgefüllt. Das scheint also ein Fehler zu sein. Ich stelle ein Problem darüber, es sei denn, es gibt unterschiedliche Ansichten?
Es müsste execute=": form1 form2" sein (wenn Sie das Standard-Trennzeichen haben), aber sowieso nein, tut es nicht. Es sendet nur die zweite.
Wenn Sie @all in das erste Formular schreiben, wird nur das erste gesendet. Zumindest auf Safari 5 / Firefox 3.6.3 jedenfalls. Ich denke, man müsste sich das Mojarra-Javascript ansehen, um mehr herauszufinden.
Haben Sie das versucht?
%Vor%Sendet es die Daten beider Formulare, wenn Sie sie ausdrücklich erwähnen?
AFAIK, Sie haben recht: @all repräsentiert die ganze Seite.