有条件地显示纯 HTML 元素
Posted
技术标签:
【中文标题】有条件地显示纯 HTML 元素【英文标题】:Conditionally display pure HTML elements 【发布时间】:2011-09-08 10:38:09 【问题描述】:我想有条件地显示以下元素:
<li>
<h:link outcome="mypage" value="My Value" />
</li>
所以我的条件应该确定<li>
标签及其所有子标签是否会显示。 AFAIK,我不能使用 <f:verbatim>
,因为 <li>
标签 (<h:link>
) 内的 UIComponent。
有什么想法吗?
【问题讨论】:
【参考方案1】:还有另一个不使用 <f:verbatim>
的原因:它在 JSF 2.0 中已弃用。
使用<ui:fragment>
。它在语义上比 <h:panelGroup>
更正确(当没有指定客户端特定属性时,它本身确实不呈现任何内容)并且开销也更少。
<ui:fragment rendered="#bean.show">
...
</ui:fragment>
(注意:由于一些错误,Netbeans 似乎不支持这个属性,但这是不正确的,它肯定是支持的)
【讨论】:
正确。如果没有给出任何参数,文档没有明确说明<h:panelGroup>
是否会呈现任何内容。但我们都知道,你也证实了这一点。另外,我也不喜欢重载职责,因为<h:panelGroup>
已经用于渲染块或内联元素。因此,<ui:fragment>
更适合此类问题。
@BalusC 对不起,我不想用 cmets 污染那个答案,但我真的不明白“当没有指定客户端特定属性时不渲染”,我从你的回答中了解到这是您选择 ui:fragment 而不是 h:panelGroup 的主要原因,但我不明白这句话是什么意思。感谢您的任何解释
@Tarik:尝试<h:panelGroup rendered="#true">
并检查 html 输出。你什么也看不到,比如<ui:fragment rendered="#true">
。但是,一旦您将客户端特定属性添加到 <h:panelGroup>
,例如 id
、styleClass
、title
等,那么它将呈现 HTML <span>
。
@BalusC 我试过 <h:panelGroup>
,情况就会发生变化。然后它会渲染一个<span>
,在OP的情况下最终会出现无效的HTML标记(它不属于<li>
)。【参考方案2】:
您可以将元素包装在h:panelGroup
中,并在面板组的rendered
属性上使用您的条件。
<h:panelGroup rendered="...">
<li>
<h:link outcome="mypage" value="My Value" />
</li>
<h:panelGroup>
【讨论】:
你是对的,但<ui:fragment>
更好,因为它是为此而设计的。而且它更明确(即用户不必知道如果没有style
或styleClass
,则不会呈现任何内容)
我的意思是,没有包裹元素
@bluefoot 为什么需要一些东西来包装元素?以上是关于有条件地显示纯 HTML 元素的主要内容,如果未能解决你的问题,请参考以下文章