是否可以在<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 />
个元素。
我怎样才能达到要求呢?
答案 0 :(得分:3)
注意:我会忽略代码的粗心表达,导致它根本无法编译/运行。 <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>