在 <ui:repeat> 中指定元素的条件渲染? <c:if> 似乎不起作用

Posted

技术标签:

【中文标题】在 <ui:repeat> 中指定元素的条件渲染? <c:if> 似乎不起作用【英文标题】:Specify conditional rendering of element inside <ui:repeat>? The <c:if> does not seem to work 【发布时间】:2011-11-07 02:04:07 【问题描述】:

我正在尝试使用&lt;ui:repeat&gt; 有条件地构建自定义列表。在列表中每次出现 -1 作为 item-value 时,我需要添加一个换行符。

我尝试在&lt;ui:repeat&gt; 中使用&lt;c:if&gt;,但它似乎不起作用。它总是评估false

<ul>      
    <ui:repeat value="#topics.list" var="topicId" >
        <li>#topicId</li>
        <c:if test="#topicId eq -1">  <br/>  </c:if>
    </ui:repeat>
</ul>

这可能吗?

【问题讨论】:

【参考方案1】:

不使用 JSTL 标签,不。它们在视图构建期间运行,而不是在视图渲染期间运行。您可以将其可视化如下:当 JSF 构建视图时,JSTL 标签首先从上到下运行,结果是一个纯 JSF 组件树。然后当 JSF 渲染视图时,JSF 组件从上到下运行,结果是一堆 html。因此,JSTL 和 JSF 不会像您对编码所期望的那样同步运行。在您的&lt;c:if&gt; JSTL 标签运行的那一刻,#topicId&lt;ui:repeat&gt; JSF 组件设置的变量在作用域中不可用。

您需要在感兴趣的 JSF 组件的 rendered 属性中指定条件,而不是使用 &lt;c:if&gt;。由于您实际上没有,您可以将其包装在 &lt;ui:fragment&gt; 中。

<ul>      
    <ui:repeat value="#topics.list" var="topicId" >
        <li>#topicId</li>
        <ui:fragment rendered="#topicId eq -1"><br/></ui:fragment>
    </ui:repeat>
</ul>

替代品是&lt;h:panelGroup&gt;

<h:panelGroup rendered="#topicId eq -1"><br/></h:panelGroup>

或在您的特定情况下&lt;h:outputText escape="false"&gt;

<h:outputText value="&lt;br/&gt;" escape="false" rendered="#topicId eq -1" />

当没有指定客户端属性时,两者都不会向 HTML 输出发出任何其他内容。

另见:

JSTL in JSF2 Facelets... makes sense?

与具体问题无关,这是&lt;br/&gt;错误位置。任何遵守 HTML 规范的网络浏览器都会忽略它。你不是说要&lt;li&gt; 里面吗?或者更好的是,给它一个class,让CSS给它一个margin-bottom

【讨论】:

谢谢!关于您对 的使用提出的担忧,在我的实际场景中,我想添加一些元素。我只是用它们来解决问题,目的是为了简化。

以上是关于在 <ui:repeat> 中指定元素的条件渲染? <c:if> 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Web.Config 的 Location Path 元素中指定多个目录

复杂元素-通过class获取多元素中指定元素的值

复杂元素-通过class获取多元素中指定元素的值

复杂元素-通过class获取多元素中指定元素的值

复杂元素-通过class获取多元素中指定元素的值

复杂元素-通过class获取多元素中指定元素的值