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

Raj*_*pta 21 jsf jstl el jsf-2 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>
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Bal*_*usC 34

没有JSTL标签,没有.它们在视图构建时运行,而不是在视图渲染时.您可以按如下方式将其可视化,当JSF构建视图时,JSTL标记首先从底部开始运行,结果是纯JSF组件树.然后,当JSF呈现视图时,JSF组件从上到下运行,结果是一堆HTML.因此,JSTL和JSF不会像编码所期望的那样同步运行.在您的<c:if>运行时,#{topicId}范围内不可用.

<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>
Run Code Online (Sandbox Code Playgroud)

替代方案是 <h:panelGroup>

<h:panelGroup rendered="#{topicId eq -1}"><br/></h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

或在您的具体情况下 <h:outputText escape="false">

<h:outputText value="&lt;br/&gt;" escape="false" rendered="#{topicId eq -1}" />
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:


具体问题无关,这是一个错误的地方<br/>.任何关于HTML规范的webbrowser都会忽略它.难道你的意思是它是里面<li>?或者更好,给它一个class让CSS给它一个margin-bottom.