我试图有条件地使用<ui:repeat>
构建自定义列表。每次在list中出现-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>
这可能吗?
不使用JSTL标签,不。它们在视图构建时运行,而不是在视图呈现时运行。您可以将其可视化如下:当JSF构建视图时,JSTL标记首先从上到下运行,结果是一个纯JSF组件树。然后,当JSF呈现视图时,JSF组件从上到下运行,结果是一堆HTML。因此,JSTL和JSF并不像您期望的那样同步运行。在您的<c:if>
JSTL标记运行时,<ui:repeat>
JSF组件设置的#{topicId}
变量在作用域中不可用。
您需要在感兴趣的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在JSF2 Facelets…有道理吗?
与具体问题无关的,这是<br/>
的错误的位置。它将被任何尊重HTML规范的web浏览器忽略。你的意思不是让在 <li>
里面吗?或者给它一个class
,让CSS给它一个margin-bottom
。