Ausführung überspringen ui: include, wenn die übergeordnete UI-Komponente nicht gerendert wird

8

Ich habe das folgende Konstrukt an mehreren Stellen in meiner Webanwendung, um Seitenfragmente abhängig von einigen Aktionen bedingt zu rendern:

%Vor%

Ich habe beobachtet, dass <ui:include> immer noch ausgeführt wird, auch wenn das Attribut rendered false auswertet. Dies erzeugt unnötigerweise alle mit der service1.xhtml -Datei verbundenen Hintergrund-Beans, die enthalten sind.

Wie kann ich die Ausführung von <ui:include> überspringen, wenn die übergeordnete UI-Komponente nicht gerendert wird, sodass nicht alle diese Backing-Beans unnötigerweise erstellt werden?

    
Harsha_2012 16.08.2012, 14:40
quelle

2 Antworten

9

Leider ist dies beabsichtigt. Das <ui:include> wird während der Erstellung der Ansicht als Taghandler ausgeführt, während das Attribut rendered während der Renderzeit der Ansicht ausgewertet wird. Dies kann besser verstanden werden, wenn man diese Antwort sorgfältig liest und "JSTL" durch " <ui:include> " ersetzt: JSTL in JSF2 Facelets ... macht Sinn?

Je nach konkreter funktionaler Anforderung gibt es mehrere Möglichkeiten, dies zu lösen:

  1. Verwenden Sie ein View-Build-Zeit-Tag wie <c:if> anstelle von <h:panelGroup> . Dies hat jedoch Auswirkungen auf die #{managedBean} . Es kann nicht im View-Bereich sein und sollte seine Arbeit basierend auf HTTP-Anforderungsparametern erledigen. Genau diese HTTP-Anforderungsparameter sollten auch in nachfolgenden Anforderungen beibehalten werden (z. B. <f:param> , includeViewParams usw.), damit sie beim Wiederherstellen der Ansicht nicht beschädigt werden.

  2. Ersetze <ui:include> durch eine benutzerdefinierte UIComponent welche ruft FaceletContext#includeFacelet() während der UIComponent#encodechildren() Methode. Bisher existiert keine solche Komponente in einer der vorhandenen Bibliotheken. Aber ich kann sagen, dass ich bereits eine solche für zukünftige OmniFaces in Betracht gezogen habe und es funktioniert so intuitiv wie hier in meiner Testumgebung (mit Mojarra). Hier ist ein Kickoff-Beispiel:

    %Vor%
BalusC 16.08.2012 16:47
quelle
6

Verwenden Sie bedingten Ausdruck als ui: include src:

%Vor%     
Neil Stevens 21.02.2013 22:13
quelle

Tags und Links