2

可以在<c:if>里面使用<a4j:repeat>吗?

我需要渲染<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 />元素。

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

4

1 回答 1

3

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


回到你的具体问题,这个构造确实会失败。在<c:if>视图构建时运行(即将基于 Facelets/JSP 文件填充 JSF 组件树时),而<a4j:repeat>在视图渲染时运行(当即将基于 JSF 组件树生成 HTML 代码时)。因此,目前<c:if>运行时,#{idx}范围内根本不存在,并且始终评估为null.

基本上有2个解决方案:

  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>
    

也可以看看:

于 2012-12-06T21:04:11.033 回答