This page (revision-184) was last changed on 21-Apr-2017 08:27 by Dieter Käppel

This page was created on 09-Aug-2012 13:29 by Dieter Käppel

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
184 21-Apr-2017 08:27 36 KB Dieter Käppel to previous
183 21-Apr-2017 08:27 36 KB Dieter Käppel to previous | to last
182 15-Jan-2016 10:18 36 KB Dieter Käppel to previous | to last
181 15-Jan-2016 10:16 36 KB Dieter Käppel to previous | to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 772 added 45 lines
!!Component Injection
Gelegentlich kann der Wunsch bestehen, einzelne Elemente in eine Scope-Komponente zu injecten. Dieses Design-Pattern kann durch die den Tag <e:insert> erreicht werden, auch im Zusammenhang mit <c:forEach> bzw. <e:for>.
Im folgenden Beispiel wird ein Save-Button einem Dialog hinzugefügt:
{{{
<app:editResource value="#{processDetails.process.title}"
rendered="#{facesContext.externalContext.isUserInRole('ROLE_MANAGER')}">
<h:form id="resource-form">
<ext:buttons>
<h:commandButton value="#{messages['save']}" action="#{processDetails.save}">
<f:ajax/>
<e:unload scopeId=":textList"/>
</h:commandButton>
</ext:buttons>
</h:form>
</app:editResource>
}}}
Im Tag <app:editResource>:
{{{
<e:load scopeId=":textList">
<f:param name="resource" value="#{cc.attrs.value}"/>
<f:param name="children" value="#{cc.children}"/>
</e:load>
}}}
Und schließlich im Scope:
{{{
<c:forEach items="#{scope.children}" var="child">
<h:panelGroup style="padding: 5px 5px 0 0;" rendered="#{child.rendered}">
<e:insert component="#{child}"/>
</h:panelGroup>
</c:forEach>
__Erklärung:__ Die Composite-Children werden durch die EL-Expression cc.children als Scope-Variable übergeben und durch den Insert-Tag eingefügt. Natürlich kann der Zwischenschritt über die Composite-Component auch entfallen. In diesem Fall können die Children zum Beispiel auch mit der EL-Expression component.children übergeben werden.
__Hinweis:__ Die so eingefügten Komponenten werden an ihrer Ursprungsstelle ausgeführt, was sich insbesondere bei Action-Methoden auswirken kann, wenn auf Variablen zugegriffen wird. Component-Injection sollte daher nur für einfache Elemente verwendet werden, da es schnell zu unsauberen Code führen kann.
__Alternative:__ Als saubere Lösung für Scopes, die in unterschiedlichen Varianten auftreten, kann der Inhalt des Scopes in eine XHTML-Datei ausgelagert werden. Dann werden mehrere Scopes mit den entsprechenden Varianten aufgebaut.
}}}