如何确定组件是否在某个方面内?

How can I determine whether a component is inside a certain facet?

在 JSF 中,我需要检查组件是否在名称为 "foo" 的方面内。我写了下面的代码来测试组件是否在一个方面:

boolean insideFacet = false;
UIComponent parent = uiComponent.getParent();

if (parent != null) {

    UIComponent grandparent = parent.getParent();

    if (grandparent != null) {

        UIComponent facet = grandparent.getFacet("foo");

        if (facet != null && facet.equals(parent)) {
            insideFacet = true;
        }
    }
}

f:facet:

中有多个标签时,此代码可以正常工作(即 insideFacet 等于 true
<example:container>
    <f:facet name="foo">
        <example:componentInFacet />
        <h:outputText value="text" />
    </f:facet>
</example:container>

然而,当 f:facet 中只有一个组件时,insideFacet 等于 false:

<example:container>
    <f:facet name="foo">
        <example:componentInFacet />
    </f:facet>
</example:container>

我错过了什么?

根据mojarra and myfaces的源代码---JSF的两种实现---当只有一个组件在一个facet中时,那个组件方面。所以你需要修改你的代码来检查facet是否是这样的组件:

UIComponent facet = parent.getFacet("foo");

if (facet != null && facet.equals(uiComponent)) {
    insideFacet = true;
}

将其与您的代码放在一起:

boolean insideFacet = false;
UIComponent parent = uiComponent.getParent();

if (parent != null) {

    UIComponent facet = parent.getFacet("foo");

    if (facet != null && facet.equals(uiComponent)) {
        insideFacet = true;
    }
    else {

        UIComponent grandparent = parent.getParent();

        if (grandparent != null) {

            UIComponent facet = grandparent.getFacet("foo");

            if (facet != null && facet.equals(parent)) {
                insidefacet = true;
            }
        }
    }
}

注意: 似乎the JSF spec 要求将添加到构面的第一个组件命名为构面(参见:第 9.2.3 节)。不过,我似乎找不到任何关于实现应如何处理一个方面内的多个组件的规范语言。我认为无论如何依赖这种行为是安全的,因为它自 JSF 2.0 以来没有改变,并且在两个 JSF 实现中都是相同的。如果有人在 JSF 规范中找到指定实现如何处理构面内的多个组件的信息,请发表评论,我会将其添加到我的答案中。

注2:我没有在复合组件上测试过这个方法,所以可能行不通。