Was soll f: ajax execute="@ all" eigentlich machen? Es POST nur die umschließende Form

8

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 ..

    
dave 08.06.2010, 16:07
quelle

4 Antworten

7

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.

Siehe auch:

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" Feature, bei dem Sie explizit alle anderen Formulare wie unten angeben (die PFS partialSubmit="true" dient nur der Vereinfachung, eine hardcodierte Sammlung wie @(form) usw. ist auch nur möglich).

%Vor%

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.

Siehe auch:

BalusC 19.12.2015 15:47
quelle
4

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?

    
Tuukka Mustonen 11.10.2010 12:51
quelle
1

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.

    
dave 10.06.2010 16:27
quelle
0

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.

    
Vítor E. Silva Souza 10.06.2010 12:46
quelle

Tags und Links