Einstellung ui: param bedingt

8

Ich möchte einen ui: param abhängig von einem Bean-Wert setzen und dachte mir c: wäre eine gute Idee. Also habe ich auf meiner Seite folgenden Code eingefügt:

%Vor%

aber der Parameter ist nicht gesetzt ...

Wenn ich den Wert von #{subscriptionListController.model.listViewName eq 'mySubscriptions'} ausgeben lasse, werde ich in dem entsprechenden Fall wahr und in den anderen zwei Fällen falsch.

Am Anfang hatte ich nur 2 Möglichkeiten und löste es mit dem ternären Operator:

%Vor%

und es hat funktioniert. Aber jetzt habe ich mehr Möglichkeiten ...

Was mache ich falsch?

    
Francesco 04.12.2013, 10:10
quelle

2 Antworten

10

Wie von <ui:composition template> angezeigt, stellt diese Seite einen Vorlagenclient dar.

Any <ui:param> outside <ui:define> gilt für die Mastervorlage (die Datei, die Sie im template -Attribut deklariert haben) und wird im Vorlagenclient selbst ignoriert. Wenn Sie beabsichtigen, Variablen für den Vorlagen-Client zu erstellen, sollten Sie <ui:param> in <ui:define> einfügen.

Aber es gibt noch eine andere Sache: Der ursprüngliche Zweck von <ui:param> besteht darin, Variablen an die Datei zu übergeben, auf die von <ui:composition template> , <ui:decorate template> oder <ui:include src> verwiesen wird, um Variablen im aktuellen Facelet-Kontext nicht vorzubereiten / festzulegen. Für die einzige funktionale Anforderung zum Vorbereiten / Setzen von Variablen im aktuellen EL-Kontext verwenden Sie besser JSTL <c:set> für den Job. Sie können dafür <ui:param> verwenden, aber dies ist nicht die ursprüngliche Absicht und funktionierte in älteren MyFaces-Versionen nicht so.

Also, so:

%Vor%

Unrelated auf das konkrete Problem, Sie können dies wie folgt optimieren, ohne eine nicht wartende <c:if> -Gruppe zu benötigen, die nur mit jedem Abonnementtyp wächst:

%Vor%

mit diesen Tasten

%Vor%     
BalusC 04.12.2013, 13:39
quelle
2

Sie verwenden JSTL mit Facelets. JSTL werden während der Erstellung der Ansicht ausgeführt und nicht in der Render-Phase. Zusätzlich gibt es einige Probleme bei der Verarbeitung in JSF2-Bibliotheken - wie in älteren Mojarra-Versionen, wo sie nicht in View-Scoped-Beans mit teilweiser Statusspeicherung arbeiteten - siehe Ссылка ). Deshalb hat dein EL Ausdruck funktioniert.

Die Lösung besteht darin, JSTL zu vermeiden - verwenden Sie stattdessen: c: forEach und EL expression und bedingtes Rendern anstelle von c: if.

    
Web Devie 04.12.2013 10:17
quelle

Tags und Links