gpt4 book ai didi

jsf - 仅当至少呈现两个子项(标题+项目)时,如何呈现 JSF 组件?

转载 作者:行者123 更新时间:2023-12-04 14:56:26 25 4
gpt4 key购买 nike

我有一个:

<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 的东西以在父 panelGroup 的 rendered 属性中使用)

最佳答案

这可以通过 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 结束。 .看来 #{component} EL 变量在 rendered 时刻仍然代表前一个组件。属性被咨询。这有点像鸡蛋问题: #{component}当前组件仅在其 rendered 时才被注入(inject)属性评估 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>

关于jsf - 仅当至少呈现两个子项(标题+项目)时,如何呈现 JSF 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37622161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com