在JSF中,我需要检查组件是否在名称为"foo"
的构面内。我编写了以下代码来测试组件是否在facet中:
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;
}
}
}
当insideFacet
中有多个标记时,此代码正常工作(即true
等于f:facet
):
<example:container>
<f:facet name="foo">
<example:componentInFacet />
<h:outputText value="text" />
</f:facet>
</example:container>
但是,当insideFacet
中只有一个组件时,false
等于f:facet
:
<example:container>
<f:facet name="foo">
<example:componentInFacet />
</f:facet>
</example:container>
我错过了什么?
答案 0 :(得分:3)
根据mojarra和myfaces的源代码--- JSF的两个实现 - 当一个组件只在一个方面内时,该组件 方面。所以你需要修改你的代码来检查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节)。我似乎无法找到任何关于实现如何处理facet中的多个组件的规范语言。我认为依赖这种行为是安全的,因为它自JSF 2.0以来没有改变,并且在两个JSF实现中都是相同的。如果有人在JSF规范中找到指定实现如何处理facet中多个组件的信息,请发表评论并将其添加到我的答案中。
注2:我没有在复合组件上测试此方法,因此可能无效。