有条件地显示纯 HTML 元素

Posted

技术标签:

【中文标题】有条件地显示纯 HTML 元素【英文标题】:Conditionally display pure HTML elements 【发布时间】:2011-09-08 10:38:09 【问题描述】:

我想有条件地显示以下元素:

<li>
  <h:link outcome="mypage" value="My Value" />
</li>

所以我的条件应该确定&lt;li&gt; 标签及其所有子标签是否会显示。 AFAIK,我不能使用 &lt;f:verbatim&gt;,因为 &lt;li&gt; 标签 (&lt;h:link&gt;) 内的 UIComponent。

有什么想法吗?

【问题讨论】:

【参考方案1】:

还有另一个不使用 &lt;f:verbatim&gt; 的原因:它在 JSF 2.0 中已弃用

使用&lt;ui:fragment&gt;。它在语义上比 &lt;h:panelGroup&gt; 更正确(当没有指定客户端特定属性时,它本身确实不呈现任何内容)并且开销也更少。

<ui:fragment rendered="#bean.show">
    ...
</ui:fragment>

(注意:由于一些错误,Netbeans 似乎不支持这个属性,但这是不正确的,它肯定是支持的)

【讨论】:

正确。如果没有给出任何参数,文档没有明确说明&lt;h:panelGroup&gt; 是否会呈现任何内容。但我们都知道,你也证实了这一点。另外,我也不喜欢重载职责,因为&lt;h:panelGroup&gt; 已经用于渲染块或内联元素。因此,&lt;ui:fragment&gt; 更适合此类问题。 @BalusC 对不起,我不想用 cmets 污染那个答案,但我真的不明白“当没有指定客户端特定属性时不渲染”,我从你的回答中了解到这是您选择 ui:fragment 而不是 h:panelGroup 的主要原因,但我不明白这句话是什么意思。感谢您的任何解释 @Tarik:尝试&lt;h:panelGroup rendered="#true"&gt; 并检查 html 输出。你什么也看不到,比如&lt;ui:fragment rendered="#true"&gt;。但是,一旦您将客户端特定属性添加到 &lt;h:panelGroup&gt;,例如 idstyleClasstitle 等,那么它将呈现 HTML &lt;span&gt; @BalusC 我试过 结果在我看来很正常,都显示一个 outputText,我错过了什么? @Tarik:一旦将客户端属性添加到&lt;h:panelGroup&gt;,情况就会发生变化。然后它会渲染一个&lt;span&gt;,在OP的情况下最终会出现无效的HTML标记(它不属于&lt;li&gt;)。【参考方案2】:

您可以将元素包装在h:panelGroup 中,并在面板组的rendered 属性上使用您的条件。

<h:panelGroup rendered="...">
  <li>
    <h:link outcome="mypage" value="My Value" />
  </li>
<h:panelGroup>

【讨论】:

你是对的,但&lt;ui:fragment&gt; 更好,因为它是为此而设计的。而且它更明确(即用户不必知道如果没有stylestyleClass,则不会呈现任何内容) 我的意思是,没有包裹元素 @bluefoot 为什么需要一些东西来包装元素?

以上是关于有条件地显示纯 HTML 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地显示一个元素,保持其占用空间?

如何根据用户角色有条件地显示 JSP 页面的元素

如何有条件地将某些内容封装在 HTML 元素中

根据功能组件中的数据有条件地渲染元素

React - 有条件地渲染多个元素

如何使用 EJS 模板有条件地显示 HTML?