在JSF2中,如何知道复合组件是否有子项?

时间:2011-02-13 07:59:28

标签: jsf jsf-2 children composite-component

我正在编写一个复合组件,你有一个名为:

的特殊标签
<composite:insertChildren />

在那里插入所有组件的子项。有没有办法知道该组件是否有孩子?就像一个可以在“渲染”属性上进行的布尔值。

3 个答案:

答案 0 :(得分:7)

您所遵循的基本表达如下:

#{cc.childCount}或更精心制作:

#{component.getCompositeComponentParent(component).childCount}

E.g。以下复合组件:

<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>

用于以下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>

将打印Children: 2

因此#{cc.childCount != 0}将告诉您复合组件是否有子项。

答案 1 :(得分:6)

我遇到了同样的问题,设法在其中找到了复合组件的子元素'javax.faces.component.COMPOSITE_FACET_NAME'。

在Java中就是这样:

// we are within some method of UIComponent
UIComponent childrenHolderFacet = getFacets().get("javax.faces.component.COMPOSITE_FACET_NAME");
Iterator<UIComponent> childrenIt = childrenHolderFacet.getChildren().iterator();
...

在JSF中,它类似于:

#{component.getFacets().get("javax.faces.component.COMPOSITE_FACET_NAME").children}

希望它有所帮助。

答案 2 :(得分:2)

至少在Mojarra上,这不起作用。复合组件的子项插入得很好,但访问#{cc.parent}#{cc.children}在2.0.2上不起作用,而#{cc.childCount}始终在2.0.4上返回0,无论孩子的数量。