鉴于我想在这样的页面上安排一个集合:
<!-- Group 0 -->
<div style="float:left;">
<div><!-- Item 0 --></div>
<div><!-- Item 1 --></div>
<!-- ... -->
<div><! -- Item n - 1 --></div>
</div>
<!-- Group 1 -->
<div style="float:left;">
<div><!-- Item n --></div>
<div><!-- Item n + 1 --></div>
<!-- ... -->
<div><! -- Item 2n - 1 --></div>
</div>
<!-- ... -->
<!-- Group g -->
<div><!-- Item gn --></div>
<div><!-- Item gn + 1 --></div>
<!-- ... -->
<div><! -- Item (g + 1)n - 1 --></div>
</div>
我是否可以使用某种技巧在ui中执行此操作:重复或通过其他技术,最好而不是创建自定义组件?
答案 0 :(得分:8)
您可以按varStatus
属性检查当前循环,并在必要时打印中间人</div><div style="float: left;">
。
E.g。每3项:
<div style="float: left;">
<ui:repeat value="#{bean.list}" var="item" varStatus="loop">
<h:outputText value="</div><div style='float: left;'>" escape="false" rendered="#{not loop.first and loop.index % 3 == 0}" />
<div>#{item}</div>
</ui:repeat>
</div>
请注意,不可能将此包装为<h:panelGroup>
内的纯HTML,因为它会导致XML格式不正确,因此<h:outputText escape="false">
将它们作为XML实体。
更新,这是另一种方法,<div>
仅定义一次,这可能不那么令人困惑:
<ui:repeat value="#{bean.list}" var="item" varStatus="loop">
<h:outputText value="<div style='float: left;'>" escape="false" rendered="#{loop.index % 3 == 0}" />
<div>#{item}</div>
<h:outputText value="</div>" escape="false" rendered="#{loop.last or (loop.index + 1) % 3 == 0}" />
</ui:repeat>
答案 1 :(得分:3)
如果可能的话,我会破坏服务器端的收集:
<ui:repeat value="#{groups}" var="group">
<div style="float:left;">
<ui:repeat value="#{group.items}" var="item">
<div>#{item.content}</div>
</ui:repeat>
</div>
</ui:repeat>
另一种选择可能是(未经测试,特别是对尺寸行为不确定):
<ui:repeat value="#{items}" var="group" varStatus="status" step="n">
<div style="float:left;">
<ui:repeat value="#{items}" var="item" offset="#{status.index}" size="#{status.index + n}">
<div>#{item.content}</div>
</ui:repeat>
</div>
</ui:repeat>
编辑:第二个版本已被替换