【发布时间】:2016-01-12 18:22:25
【问题描述】:
我已按照以下示例将惰性查询容器链接到 Vaadin Grid https://vaadin.com/wiki/-/wiki/Main/Lazy%20Query%20Container/
这些示例要求 Query 实现具有 @Override public int size() 方法。 好像,Grid就是用这个方法来获取设置容器时显示的对象总数。
Size 方法需要计数和全表扫描,这在我们的例子中是非常昂贵的。
我们不想立即设置大小,而是希望在每个 loadItems 调用中更改/更新它“@Override public List loadItems(int startIndex, int count)”。
通知容器(以及最终使用该容器的网格)有关最新已知大小的最佳方式是什么?
有没有设置懒惰的例子?
提前谢谢你。
【问题讨论】:
-
我个人还没有使用过,但我怀疑分页需要大小。在不知道数据库中有多少项目的情况下,很难确定在
public List loadItems(int startIndex, int count)期间要加载哪个块@ -
将大小估计推迟到 loadItems 调用对您有帮助吗?无论如何,在第一次渲染时,这种 UI 模式都需要大小。如果您无法优化计数查询,我也会在 UI 级别退回到“传统分页”。有些人使用(对于这个一般问题)单独的表和 SQL 触发器。
-
感谢您的回复。这是我尝试过的,但到目前为止它不起作用:我将 LazyContainer Size 设置为 Integer.MAX_VALUE。每个 loadItems 方法调用,都会从数据库中查询请求的间隔,如果不是最后一页,它将保持大小为整数最大值。如果它是最后一页,它将为容器设置正确的大小。因此,容器本身似乎可以工作。但是,Grid 仅在容器最初分配给 Grid 时才检查大小。并且永远不会在 loadItems 方法调用之前或之后再次查询大小。它总是假设大小是相同的。
-
您可以尝试以某种方式触发 ItemSetChangeEvent,这应该会通知组件项目数量可能已更改。您也可以尝试 MGrid 中的方法(在 Viritin 附加组件中):github.com/viritin/viritin/blob/master/src/main/java/org/vaadin/… 这会使缓存无效,可能会起作用,但不确定。你也可以直接用类似的方法尝试 MGrid,它有相当先进和更简单的延迟加载解决方案。
标签: vaadin lazy-loading vaadin-grid