在<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="<br/>" escape="false" rendered="#{topicId eq -1}" />
因为当没有指定客户端属性时,两者都不会向HTML输出发送任何其他内容。
也可以看看:
- JSF2 Facelets中的JSTL …有意义吗?
<br/>
与具体问题无关 ,这是一个错误的地方。 任何关于HTML规范的浏览器都会被忽略。 你不是说要在 <li>
里面吗? 或者更好,给它一个class
,让CSS给它一个margin-bottom
。