p:即使没有切换,也会渲染rowExpansion

时间:2015-08-11 13:42:33

标签: jsf primefaces datatable

在扩展行之前,<p:rowExpansion>中的数据存在问题(这会导致大量的Web服务请求)。

我正在使用PrimeFaces 5.2。我有一个带延迟加载和分页的dataTable。在表格内,我<p:rowToggler> <p:rowExpansion>

<p:dataTable var="order"
             widgetVar="orderTable"
             lazy="true"
             value="#{ordersBean.orders}"
             paginator="true"
             rows="20"
             rowsPerPageTemplate="20,50,100"
             filterDelay="300"
             styleClass="filtered">

    <p:column width="4%">
        <p:rowToggler />
    </p:column>

    <p:column headerText="Order number" width="96%">
        <h:outputText value="#{order.number}" />
    </p:column>

    <p:rowExpansion>
        <h:panelGrid columns="1">
            <h:outputText value="#{order.number}" />
            <h:outputText value="#{order.info}" />

            <h:dataTable var="item" value="#{ordersBean.getItemsInOrder(order.number)}">
                <h:column>
                    <h:outputText value=" #{item.title}" />
                </h:column>
            </h:dataTable>

        </h:panelGrid>
    </p:rowExpansion>
</p:dataTable>

当我第一次加载页面时,除了扩展行时,不会调用getItemsInOrder()方法。但是,如果我使用分页器导航到第2页(或者我之后导航回第1页),则会为外部表中的每一行调用getItemsInOrder()。由于我显示了20行,因此在页面之间导航会导致20个Web服务请求(getItemsInOrder())。

如何阻止它在扩展行之前调用getItemsInOrder()方法?

1 个答案:

答案 0 :(得分:0)

我有同样的问题。在找到更好的解决方案之前,这是我正在使用的解决方法:

  • 在事件rowToggle上注册一个(DataTable事件 - )侦听器。
  • 在侦听器中,存储切换行的标识符。提示:您可以使用event.getData()
  • 获取行对象
  • 不是直接访问数据请求组件,而是在其前面编写一个代理方法,检查所请求的对象是否属于监听器中存储的标识符。