Dies ist mit EL 3.0 Stream API erreichbar. Mein erster Versuch war:
<h:panelGroup rendered="#{component.children.stream().filter(c -> c.rendered).count() gt 1}">
<h:outputText value="title" />
<h:panelGroup rendered="#{false}">item1</h:panelGroup>
<h:panelGroup rendered="#{false}">item2</h:panelGroup>
<h:panelGroup rendered="#{false}">item3</h:panelGroup>
</h:panelGroup>
jedoch, dass nicht ganz gut funktionierte. Es lief unerwartet in eine Endlosschleife, die schließlich mit einer OutOfMemoryError
endete. Es scheint, dass die #{component}
EL-Variable immer noch die vorherige Komponente in dem Moment darstellt, in dem das Attribut rendered
herangezogen wird. Dies ist ein bisschen ein Hühnerei Problem: die #{component}
für aktuelle Komponente wird nur injiziert, wenn sein rendered
Attribut true
wertet.
Da kann ich zwei weitere Optionen: explizit die Komponente von ID finden, wie unten,
<h:panelGroup id="foo" rendered="#{component.findComponent('foo').children.stream().filter(c -> c.rendered).count() gt 1}">
<h:outputText value="title" />
<h:panelGroup rendered="#{false}">item1</h:panelGroup>
<h:panelGroup rendered="#{false}">item2</h:panelGroup>
<h:panelGroup rendered="#{false}">item3</h:panelGroup>
</h:panelGroup>
oder lassen Sie es einige CSS-Klasse drucken, die wiederum ein display:none;
tut.
<h:panelGroup styleClass="#{component.children.stream().filter(c -> c.rendered).count() gt 1 ? 'show' : 'hide'}">
<h:outputText value="title" />
<h:panelGroup rendered="#{false}">item1</h:panelGroup>
<h:panelGroup rendered="#{false}">item2</h:panelGroup>
<h:panelGroup rendered="#{false}">item3</h:panelGroup>
</h:panelGroup>
Das habe ich für jetzt getan, danke! Aber gibt es keinen abstrakteren Weg? –
Ich kann nur daran denken, was BalusC hier schon geschrieben hat. :) –