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

时间:2012-12-06 20:22:25

标签: jsf jstl repeat ajax4jsf

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

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

<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 />个元素。

我怎样才能达到要求呢?

1 个答案:

答案 0 :(得分:3)

注意:我会忽略代码的粗心表达,导致它根本无法编译/运行。 <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>
    
  3. 另见: