5

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

<composite:insertChildren />

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

4

3 回答 3

7

您所追求的基本表达式如下:

#{cc.childCount}或更详细地说:

#{component.getCompositeComponentParent(component).childCount}

例如以下复合组件:

<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}将告诉您复合组件是否有子组件。

于 2011-02-13T08:39:21.110 回答
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}

希望能帮助到你。

于 2011-06-03T06:39:48.103 回答
2

至少在 Mojarra 上这是行不通的。复合组件的子组件可以很好地插入,但在 2.0.2 上访问#{cc.parent}#{cc.children}不起作用,并且无论子组件的数量如何,#{cc.childCount}总是在 2.0.4 上返回。0

于 2011-03-01T11:00:49.823 回答