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



我试图有条件地使用<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="&lt;br/&gt;" escape="false" rendered="#{topicId eq -1}" />
当没有指定客户端属性时,

也不会向HTML输出发送任何其他内容。

参见:

  • JSTL在JSF2 Facelets…有道理吗?

与具体问题无关的,这是<br/>错误的位置。它将被任何尊重HTML规范的web浏览器忽略。你的意思不是让 <li>里面吗?或者给它一个class,让CSS给它一个margin-bottom

相关内容

  • 没有找到相关文章

最新更新