4

我想将网格中的一些数据延迟加载到我的 Vaadin 视图中。网格行有时非常大,所以我想限制一次加载的行数,比如说 2。

我尝试使用DataProvider.fromCallbacks(). 不幸的是,我没有得到我想要的结果,而且我对传递给该方法的两个函数有点困惑。

据我正确理解,传递的第一个函数描述了如何获取项目,第二个函数告诉 DataProvider 可以获取的最大可能数量的项目。

fromCallbacks(CallbackDataProvider.FetchCallback fetchCallback, CallbackDataProvider.CountCallback countCallback) 创建一个新的数据提供者,它使用回调从任何后备存储中获取和计算项目。

我尝试了以下方法,但它总是会导致获取很多项目。(列表中的 17 项导致提取 17 项,列表中的 120 项导致 50 个批次)

    List<SomeObject> data = ... // filled with objects

    DataProvider<CustromCell, Void> lazyLoadingProvider
            = DataProvider.fromCallbacks(
                    query -> {
                        int offset = query.getOffset();
                        int limit = query.getLimit(); // Is this the amount of items that are fetched in one step?

                        if (offset + limit > data.size()) 
                            return data.stream();

                        List<CustromCell> cells = data.subList(offset,offset+limit); 
                                                                 //(offest,offset+2) crashes
                        return cells.stream()
                    },
                    query -> data.size() // Max possible items to fetch
            );
            grid.setDataProvider(lazyLoadingProvider);

具有以下行为:

Size Of Data: 219
Offset: 0
Limit: 50

Size Of Data: 219
Offset: 50
Limit: 50

Size Of Data: 219
Offset: 100
Limit: 50

Size Of Data: 219
Offset: 150
Limit: 50

Size Of Data: 219
Offset: 200
Limit: 19

我必须调用Query 对象的getOffset()and getLimit(),否则会引发异常。如果我理解正确,那么限制会告诉应该获取多少个项目(在我的情况下目标是 2)但是对象是不可变的,所以我不能更改这个值(查询 API)?

tl;博士我如何告诉 DataProvider 一次只获取我的网格的 2 项?

编辑:我发现了与我的问题相关的 github 问题(#6072#3830

编辑 2:合并了一个 github 问题,因此更清楚 getLimit() 方法的工作原理:https ://github.com/vaadin/flow/issues/6996

4

2 回答 2

3

我能够找到解决方案。

query.getLimit()方法取决于组件(即网格)的页面大小。

引用网格 API

网格()

创建一个新实例,页面大小为 50。

我的网格是这样初始化的:Grid a = new Grid();这导致页面大小为 50。query.getLimit()在这种情况下将返回 50。

网格(int pageSize)

创建一个具有指定页面大小的新实例。

像这样初始化网格Grid a = new Grid(5);query.getLimit()现在将在这种情况下返回 5 并且DataProvider将仅获取接下来的 5 个元素。

编辑:关于此 SO 问题的 github 问题已合并:https ://github.com/vaadin/flow/issues/6996

于 2019-11-21T12:58:55.950 回答
1

更准确地说,查询限制取决于两个主要条件:

  • 网格上的页面大小设置(如您所见)
  • 并且 - 如果您使用的是数据提供者 -数据提供者的大小

以及其他 2 个次要标准/行为:

  • 一次可以在 UI 中显示多少个元素。如果您的网格一次可以显示超过页面大小设置,那么查询限制将根据数据提供者大小和我猜的默认页面大小(50)自动调整

  • 由于网格可能会根据我刚刚解释的内容更改您的查询限制,如果您刷新数据(例如,因为您对数据提供者应用过滤),您的限制将不再是网格页面大小,除非您特别在刷新数据之前再次设置,例如:

    grid.setPageSize(GRID_PAGE_SIZE);
    grid.getDataProvider().refreshAll();
    

因此,假设您的数据提供者返回 34 个结果,您将页面大小设置为 5,并且在 UI 中显示无限数量的结果,您将有以下行为:

  1. 获取前 5 个(页面大小设置)元素
  2. 发现可以在 UI 上显示更多元素,所以在数据提供者上触发第二次 fetch
  3. 从偏移量 5 获取到限制 34

我发现这种组合根本没有记录..

于 2020-07-24T02:11:34.057 回答