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?
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:
mit diesen Tasten
%Vor%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.
Tags und Links jsf-2 primefaces facelets