是否可以在<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
。
基本上有两种解决方案:
-
使用
<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将自动生成正确的属性) -
使用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。。。有道理吗