【问题标题】:Specify conditional rendering of element inside <ui:repeat>? The <c:if> does not seem to work在 <ui:repeat> 中指定元素的条件渲染? <c:if> 似乎不起作用
【发布时间】:2011-11-07 02:04:07
【问题描述】:

我正在尝试使用&lt;ui:repeat&gt; 有条件地构建自定义列表。在列表中每次出现 -1 作为 item-value 时,我需要添加一个换行符。

我尝试在&lt;ui:repeat&gt; 中使用&lt;c:if&gt;,但它似乎不起作用。它总是评估false

<ul>      
    <ui:repeat value="#{topics.list}" var="topicId" >
        <li>#{topicId}</li>
        <c:if test="#{topicId eq -1}">  <br/>  </c:if>
    </ui:repeat>
</ul>

这可能吗?

【问题讨论】:

    标签: jsf jsf-2 jstl el uirepeat


    【解决方案1】:

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

    您需要在感兴趣的 JSF 组件的 rendered 属性中指定条件,而不是使用 &lt;c:if&gt;。由于您实际上没有,您可以将其包装在 &lt;ui:fragment&gt; 中。

    <ul>      
        <ui:repeat value="#{topics.list}" var="topicId" >
            <li>#{topicId}</li>
            <ui:fragment rendered="#{topicId eq -1}"><br/></ui:fragment>
        </ui:repeat>
    </ul>
    

    替代品是&lt;h:panelGroup&gt;

    <h:panelGroup rendered="#{topicId eq -1}"><br/></h:panelGroup>
    

    或在您的特定情况下&lt;h:outputText escape="false"&gt;

    <h:outputText value="&lt;br/&gt;" escape="false" rendered="#{topicId eq -1}" />
    

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

    另见:


    与具体问题无关,这是&lt;br/&gt;错误位置。任何遵守 HTML 规范的网络浏览器都会忽略它。你不是说要&lt;li&gt; 里面吗?或者更好的是,给它一个class,让CSS给它一个margin-bottom

    【讨论】:

    • 谢谢!关于您对
      的使用提出的担忧,在我的实际场景中,我想添加一些元素。我只是用它们来解决问题,目的是为了简化。
    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多