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

时间:2011-08-30 19:06:38

标签: jsf jsf-2 jstl el uirepeat

我正在尝试使用<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>

这可能吗?

1 个答案:

答案 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="&lt;br/&gt;" escape="false" rendered="#{topicId eq -1}" />

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

另见:


对具体问题

无关,这是<br/>错误的位置。任何关于HTML规范的webbrowser都会忽略它。你不是说里面 <li>吗?或者更好的是,给它一个class并让CSS给它一个margin-bottom