26

我正在尝试使用有条件地构建自定义列表<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>

这可能吗?

4

1 回答 1

41

没有 JSTL 标签,没有。它们在视图构建期间运行,而不是在视图渲染期间运行。您可以将其可视化如下:当 JSF 构建视图时,JSTL 标签首先从上到下运行,结果是一个纯 JSF 组件树。然后当 JSF 渲染视图时,JSF 组件从上到下运行,结果是一堆 HTML。因此,JSTL 和 JSF 不会像您对编码所期望的那样同步运行。在您的<c:if>JSTL 标签运行时,#{topicId}<ui:repeat>JSF 组件设置的变量在范围内不可用。

<c:if>您需要在rendered感兴趣的 JSF 组件的属性中指定条件,而不是使用。因为你实际上没有,你可以把它包装在一个<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 规范的网络浏览器都会忽略它。你不是说要在里面<li>?或者更好的是,给它一个class,让 CSS 给它一个margin-bottom.

于 2011-08-30T19:19:44.573 回答