问题
I'm writing a composite component, you have a special tag named:
<composite:insertChildren />
Which inserts all the component's children there. Is there any way to know whether the component has children? Like a boolean value that could go on a "rendered" attribute.
回答1:
The basic expression you're after is the following:
#{cc.childCount}
or more elaborately:
#{component.getCompositeComponentParent(component).childCount}
E.g. the following composite component:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite"
>
<cc:interface/>
<cc:implementation>
<h:outputText value="Children: #{cc.childCount}" />
</cc:implementation>
</html>
used on the following Facelet:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:test="http://java.sun.com/jsf/composite/test"
>
<h:body>
<test:myCom>
<h:outputText value="first child" />
<h:outputText value="second child" />
</test:myCom>
</h:body>
</html>
will print Children: 2
.
Thus #{cc.childCount != 0}
will tell you whether a composite component has children or not.
回答2:
I've encountered the same problem and managed to find children of a composite component within it's facet 'javax.faces.component.COMPOSITE_FACET_NAME'.
In Java it's like this:
// we are within some method of UIComponent
UIComponent childrenHolderFacet = getFacets().get("javax.faces.component.COMPOSITE_FACET_NAME");
Iterator<UIComponent> childrenIt = childrenHolderFacet.getChildren().iterator();
...
In JSF it's something like:
#{component.getFacets().get("javax.faces.component.COMPOSITE_FACET_NAME").children}
Hope it helps.
回答3:
At least on Mojarra this does not work. A composite component's children get inserted just fine but accessing #{cc.parent}
or #{cc.children}
does not work on 2.0.2, and #{cc.childCount}
always returns 0
on 2.0.4, regardless of the number of children.
来源:https://stackoverflow.com/questions/4983115/in-jsf2-how-to-know-if-composite-component-has-children