【问题标题】:limit number of iterations in ui:repeat限制 ui:repeat 中的迭代次数
【发布时间】:2013-12-02 09:52:02
【问题描述】:

我们有一个 JSF 页面,其中显示了一个带有查询结果的表格。我们只想显示前 3 个结果。

如何使用<ui:repeat> 来做到这一点?

我们不能在业务层这样做,因为它不在我们的控制之下。我们需要在视图侧将结果限制为 3。

【问题讨论】:

  • 我很困惑。你是使用ui:repeat 还是h:dataTable 作为输出?

标签: jsf jsf-2 uirepeat


【解决方案1】:

您可以按照 kocko 在他的回答中提出的方式进行操作,但是遍历整个列表以仅输出三个组件肯定是相当过分的。

这种详细方法的必要性是因为<ui:repeat> 组件的size 属性由于某种原因不允许指定EL 作为其值,而是像3 这样的普通整数。另见Jsf ui:repeat size doesn't gets java bean value

如果您知道只需要 3 个值,则可以使用 size 属性:

<ui:repeat var="var" value="#{bean.list}" size="3">
    <h:outputText value="#{var}" />
</ui:repeat>

或者,如果您在 EL2.2+ 上,您可以通过调用 List#subList(from, to) 方法获取子列表:

<ui:repeat var="var" value="#{bean.list.subList(0, (bean.list.size() gt 3) ? 3 : bean.list.size())}">
    <h:outputText value="#{var}" />
</ui:repeat>

【讨论】:

  • 它会投票支持size 选项,但如果列表包含少于 3 个元素,则会产生错误。
  • @mabi 是的,但空列表和其他大小断言都应该事先完成,即在某些条件渲染的组件内。
【解决方案2】:

您可以执行以下操作:

  1. 注册一个&lt;ui:param&gt;,它将保存显示结果的限制。在您的情况下,它将是 3
  2. 使用&lt;ui:repeat&gt;varStatus 属性,它的内部index 属性保存当前集合项的索引。

例如:

<ui:param name="limit" value="3"/>
<ui:repeat var="item" value="#{managedBean.list}" varStatus="status">
    <ui:fragment rendered="#{status.index lt limit}">
        <! -- place your value-holding-component here -->
    </ui:fragment>
</ui:repeat>

这样您将只有 3 个由 &lt;ui:repeat&gt; 呈现的组件。

注意 rendered 属性被引入到 JSF 2.1 中的 &lt;ui:fragment&gt;。如果您的 JSF 版本早于 2.1,请考虑将 &lt;ui:fragment&gt; 更改为

<h:panelGroup rendered="#{status.index lt limit}">
    <! -- place your value-holding-component here -->
</h:panelGroup>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多