在 <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 【问题描述】:我正在尝试使用<ui:repeat>
有条件地构建自定义列表。在列表中每次出现 -1 作为 item-value 时,我需要添加一个换行符。
我尝试在<ui:repeat>
中使用<c:if>
,但它似乎不起作用。它总是评估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 不会像您对编码所期望的那样同步运行。在您的<c:if>
JSTL 标签运行的那一刻,#topicId
由<ui:repeat>
JSF 组件设置的变量在作用域中不可用。
您需要在感兴趣的 JSF 组件的 rendered
属性中指定条件,而不是使用 <c:if>
。由于您实际上没有,您可以将其包装在 <ui:fragment>
中。
<ul>
<ui:repeat value="#topics.list" var="topicId" >
<li>#topicId</li>
<ui:fragment rendered="#topicId eq -1"><br/></ui:fragment>
</ui:repeat>
</ul>
替代品是<h:panelGroup>
<h:panelGroup rendered="#topicId eq -1"><br/></h:panelGroup>
或在您的特定情况下<h:outputText escape="false">
<h:outputText value="<br/>" escape="false" rendered="#topicId eq -1" />
当没有指定客户端属性时,两者都不会向 HTML 输出发出任何其他内容。
另见:
JSTL in JSF2 Facelets... makes sense?与具体问题无关,这是<br/>
的错误位置。任何遵守 HTML 规范的网络浏览器都会忽略它。你不是说要在<li>
里面吗?或者更好的是,给它一个class
,让CSS给它一个margin-bottom
。
【讨论】:
谢谢!关于您对 的使用提出的担忧,在我的实际场景中,我想添加一些元素。我只是用它们来解决问题,目的是为了简化。以上是关于在 <ui:repeat> 中指定元素的条件渲染? <c:if> 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章