在 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的源码和 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 节)。不过,我似乎找不到任何关于实现应如何处理一个方面内的多个组件的规范语言。我认为无论如何依赖这种行为是安全的,因为它自 JSF 2.0 以来没有改变,并且在两个 JSF 实现中都是相同的。如果有人在 JSF 规范中找到指定实现如何处理构面内的多个组件的信息,请发表评论,我会将其添加到我的答案中。
注意2:我没有在复合组件上测试过这个方法,所以它可能行不通。
关于jsf - 如何确定组件是否在某个方面内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274934/