我正在尝试使用<ui:repeat>
有条件地构建自定义列表。在每次出现-1作为列表中的项目值时,我需要添加换行符。
我试图在<c:if>
内使用<ui:repeat>
,但它似乎不起作用。它始终评估false
。
<ul>
<ui:repeat value="#{topics.list}" var="topicId" >
<li>#{topicId}</li>
<c:if test="#{topicId eq -1}"> <br/> </c:if>
</ui:repeat>
</ul>
这可能吗?
答案 0 :(得分:31)
没有使用JSTL标签,没有。它们在视图构建时运行,而不是在视图渲染时。您可以按如下方式将其可视化,当JSF构建视图时,JSTL标记首先从底部开始运行,结果是纯JSF组件树。然后,当JSF呈现视图时,JSF组件从上到下运行,结果是一堆HTML。因此,JSTL和JSF不会像编码所期望的那样同步运行。在<c:if>
运行的那一刻,范围内无法使用#{topicId}
。
您需要在感兴趣的JSF组件的<c:if>
属性中指定条件,而不是使用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="<br/>" escape="false" rendered="#{topicId eq -1}" />
因为当没有指定客户端属性时,两者都不会向HTML输出发送任何其他内容。
无关,这是<br/>
的错误的位置。任何关于HTML规范的webbrowser都会忽略它。你不是说里面 <li>
吗?或者更好的是,给它一个class
并让CSS给它一个margin-bottom
。