【问题标题】:How do I iterate over a sublist with ui:repeat?如何使用 ui:repeat 遍历子列表?
【发布时间】:2013-04-08 09:11:20
【问题描述】:

我正在迁移一段如下所示的遗留代码:

<c:forEach items="#{sel}" var="crit" end="12">
  <tr>
    <td class="criteriaName">
      <c:set var="tip" value="#{Factory.makeTooltip(crit.string)}" />

      <c:if test="#{0 != fn:length(tip)}">
        <a:outputPanel layout="block">
          <h:outputText value="#{crit.kriterium}" styleClass="tooltipAvailable"/>
            <rich:tooltip layout="block">
              <h:outputText escape="false" value="#{tip}" />
            </rich:tooltip>
         </a:outputPanel>
       </c:if>

       <c:if test="#{0 == fn:length(tip)}">
         <h:outputText value="#{crit.kriterium}" />
       </c:if>
     </td>
  </tr>
</c:forEach>

现在我希望将 &lt;c:if&gt;&lt;c:forEach&gt; 替换为 &lt;ui:fragment&gt;&lt;ui:repeat&gt; 对应项。问题是,我需要迭代 sel 两次:一次从 0 到 12,然后从 13 到结尾。

我还没有找到一种方法来拆分列表迭代,就像 foreach 标记的 end 属性那样。我真的很想避免在后端拆分列表,因为这是一个纯粹的视图问题,应该在那里处理。

所以问题是:我可以按照我指定的方式替换上面的片段吗?有哪些替代方案?

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    如果您使用的是 EL 2.2,则可以调用普通的 java 方法。

    假设这里selList,你可以使用

    <ui:repeat var="crit" value="#{sel.subList(0,12)}">
    

    并不是说ui:repeatc:forEach 并不总是可以互换的,因此请确保您的用例有效。

    【讨论】:

    • 如此简单,如此有效:-)
    • 第一个陈述是不正确和误导的。这根本不是 JSF 2.x 的特性。这是 EL 2.2 的功能。 JSF 2.x 可以部署到根本不支持此功能的 Servlet 2.5 / EL 2.1 容器中。另一方面,JSF 1.x 可以部署到支持此功能的 Servlet 3.0 / EL 2.2 容器中。另见:stackoverflow.com/questions/14382466/…
    • @BalusC 确实你是对的。我的印象是 JSF2 '需要' EL2.2,但显然这不是真的。我编辑了帖子。谢谢!
    • 感谢您的澄清。由于这(仍然)是一个 Seam 项目,我想知道为什么我本可以利用 EL 却一直使用 begin/end。无论如何,谢谢!
    猜你喜欢
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2012-07-08
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2013-01-26
    相关资源
    最近更新 更多