p:rowExpansion即使未切换也被渲染 [英] p:rowExpansion gets rendered even though it's not toggled

查看:123
本文介绍了p:rowExpansion即使未切换也被渲染的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在扩展行之前加载< 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:列宽= 4%>
< p:rowToggler />
< / p:列>

< p:栏标头Text =订单号 width = 96%>
< h:outputText value =#{order.number} />
< / p:列>

< 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:列>
< / h:dataTable>

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

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



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

解决方案

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




  • 在事件rowToggle上注册一个(DataTable event-)侦听器。

  • 在侦听器中,存储切换行的标识符。提示:您可以使用event.getData()

  • 获取行对象,而不是直接访问数据请求组件,而是在其前面编写一个代理方法,该方法检查所请求的对象是否属于存储在侦听器中的标识符。


I have a problem with data in a <p:rowExpansion> being loaded before the row is expanded (which leads to loads of web service requests).

I am using PrimeFaces 5.2. I have a dataTable with lazy loading and pagination. Inside of the table, I have <p:rowToggler> with a <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>

When I first load the page, the getItemsInOrder() method is not called, except for when I expand a row. But if I navigate to page 2 (or if I navigate back to page 1 later) using the paginator, then getItemsInOrder() is called for every row in the outer table. Since I have 20 rows showing, navigating between the pages leads to 20 web service requests (in getItemsInOrder()).

How do I prevent it from calling the getItemsInOrder() method until the row is expanded?

解决方案

I have the same problem. Until I find a better solution, this is the workaround I am using:

  • register a (DataTable event-) listener on event rowToggle.
  • In the listener, store an identifier of the toggled row. Hint: you can get the row object with event.getData()
  • Instead of directly accessing the data requesting component, write a proxy method in front of it which checks if the requested object belongs to the identifier stored in the listener.

这篇关于p:rowExpansion即使未切换也被渲染的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆