6

我有一个:

<h:panelGroup />
  <h:outputText value="title" />
  <h:itemThatSometimesWillShow rendered="sometimes1" />
  <h:itemThatSometimesWillShow rendered="sometimes2" />
  <h:itemThatSometimesWillShow rendered="sometimes3" />
  ...many more

我希望这样,如果 itemThatSometimesWillShow 没有显示,则整个面板(实际上是标题)也不会显示。

我确实尝试过使用复合组件#{cc.childCount} > 1,但我不在复合实现中,所以看起来它总是会返回0

任何想法?(我正在寻找带有 js 或 EL 的东西以rendered在父 panelGroup 的属性中使用)

4

2 回答 2

4

这可以通过 EL 3.0 流 API 实现。我最初的尝试是:

<h:panelGroup rendered="#{component.children.stream().filter(c -> c.rendered).count() gt 1}">
    <h:outputText value="title" />
    <h:panelGroup rendered="#{false}">item1</h:panelGroup>
    <h:panelGroup rendered="#{false}">item2</h:panelGroup>
    <h:panelGroup rendered="#{false}">item3</h:panelGroup>
</h:panelGroup>

然而,这并没有很好地工作。它意外地陷入了一个无限循环,最终以OutOfMemoryError. 在查询属性时,EL 变量似乎#{component}仍然代表前一个组件。rendered这有点像鸡蛋问题:#{component}for current 组件仅在其rendered属性评估时才被注入true

鉴于此,我可以看到另外两个选项:通过 ID 显式查找组件,如下所示,

<h:panelGroup id="foo" rendered="#{component.findComponent('foo').children.stream().filter(c -> c.rendered).count() gt 1}">
    <h:outputText value="title" />
    <h:panelGroup rendered="#{false}">item1</h:panelGroup>
    <h:panelGroup rendered="#{false}">item2</h:panelGroup>
    <h:panelGroup rendered="#{false}">item3</h:panelGroup>
</h:panelGroup>

或者让它打印一些 CSS 类,这些类依次执行display:none;.

<h:panelGroup styleClass="#{component.children.stream().filter(c -> c.rendered).count() gt 1 ? 'show' : 'hide'}">
    <h:outputText value="title" />
    <h:panelGroup rendered="#{false}">item1</h:panelGroup>
    <h:panelGroup rendered="#{false}">item2</h:panelGroup>
    <h:panelGroup rendered="#{false}">item3</h:panelGroup>
</h:panelGroup>
于 2017-10-13T19:43:13.800 回答
2

我很快就会这样做:

<h:panelGroup rendered="{bean.isSometimes()}"/>
  <h:outputText value="title" />
  <h:itemThatSometimesWillShow rended="{bean.isSometimes1()}" />
  <h:itemThatSometimesWillShow rended="{bean.isSometimes2()}" />
  <h:itemThatSometimesWillShow rended="{bean.isSometimes3()}" />

在 bean 中:

public boolean isSometimes()
{
    return isSometimes1() || isSometimes2() || isSometimes3();
}
于 2016-06-03T19:42:25.073 回答