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

我正在尝试使用<ui:repeat>有条件地构build自定义列表。 在列表中每次出现-1作为项目​​值时,我需要添加换行符。

我试图在<ui:repeat> <c:if>里面使用<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> 

这可能吗?

不用JSTL标签,不。 它们在视图构build时运行,而不是在视图渲染时。 当JSF构build视图时,您可以按如下方式对其进行可视化:JSTL标记首先从底部运行到底部,结果是纯JSF组件树。 然后当JSF呈现视图时,JSF组件从上到下运行,结果是一堆HTML。 所以,JSTL和JSF不会像编码期望的那样同步运行。 目前您的<c:if>运行时, #{topicId}在范围内不可用。

您不必使用<c:if> ,而需要在感兴趣的JSF组件的rendered属性中指定条件。 正如你实际上没有,你可以把它包装在<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="&lt;br/&gt;" escape="false" rendered="#{topicId eq -1}" /> 

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

也可以看看:

  • JSF2 Facelets中的JSTL …有意义吗?

<br/>与具体问题无关 ,这是一个错误的地方。 任何关于HTML规范的浏览器都会被忽略。 你不是说要 <li> 里面吗? 或者更好,给它一个class ,让CSS给它一个margin-bottom