是否可以在<a4j:repeat中使用<c:if>>



是否可以在<a4j:repeat>中使用<c:if>

我需要渲染一个<br />,每个元素4个。我尝试了以下方法:

<a4j:repeat value="#{MBean.sucursal.events}" var="item" rowKeyVar="idx" >   
<h:outputText value="#{item.eventDescription}" id="item1" />
<c: if test=#{idx % 4 == 0}>
<br />
</c:if>
</a4j:repeat>

但是,它根本不渲染<br />元素。

无论如何,我怎样才能达到要求?

注意:我将忽略代码的粗心公式,这会导致它根本无法正确编译/运行。<c :if>中有一个空格,并且<c:if test>属性中缺少引号。在以后的问题中,请更多地注意你发布的代码片段的正确性,否则你只会因为这些警告而得到无效的答案。


回到你的具体问题,这个构造确实会失败。<c:if>在视图构建期间运行(当JSF组件树将基于Facelets/JSP文件填充时),而<a4j:repeat>在视图呈现期间运行(HTML代码将基于JSF组件树生成时)。因此,在<c:if>运行的那一刻,#{idx}根本不存在于作用域中,并且总是计算为null

基本上有两种解决方案:

  1. 使用<c:forEach>而不是<a4j:repeat>来迭代项。它在视图构建期间运行,因此它将与<c:if>"同步"运行。

    <c:forEach items="#{MBean.sucursal.events}" var="item" varStatus="loop">   
    <h:outputText value="#{item.eventDescription}" id="item#{loop.index}" />
    <c:if test="#{loop.index % 4 == 0}">
    <br />
    </c:if>
    </c:forEach>
    

    (请注意,我也更改了<h:outputText id>,否则会出现重复的组件ID错误或格式错误的HTML;可以完全省略id属性,JSF将自动生成正确的属性)

  2. 使用JSF组件的rendered属性而不是<c:if>来有条件地呈现HTML。它在视图渲染期间运行,因此它将与<a4j:repeat>"同步"运行。

    <a4j:repeat value="#{MBean.sucursal.events}" var="item" rowKeyVar="idx">   
    <h:outputText value="#{item.eventDescription}" id="item1" />
    <h:panelGroup rendered="#{idx % 4 == 0}">
    <br />
    </h:panelGroup>
    </a4j:repeat>
    

另请参阅:

  • JSF2 Facelets中的JSTL。。。有道理吗

最新更新