1 回答
TA贡献1862条经验 获得超6个赞
您走在正确的轨道上,但您需要首先了解概念DataProvider
。
在客户端(浏览器),一旦用户与其进行交互,Vaadin 就会请求将数据显示在组合框中。请求的数据类似于“数据中有多少项?” 这是计数查询。假设您有 100 件商品。现在,下一个请求是“给我要显示的前 40 个项目”,这是获取查询。组合框将显示返回的项目。一旦用户向下滚动列表,就会发出另一个数据请求“给我接下来要显示的 40 个项目”等。
总而言之,DataProvider
首先要求返回所有项目的计数,然后根据需要逐页获取数据。当用户输入过滤器时这也适用。不同之处在于您的计数和获取查询应考虑过滤器。
示例:用户输入了过滤器“xyz”,现在只有 50 个项目与此过滤器匹配(通过名称或其他内容),因此您将在 count 方法中返回 50,并且您的 fetch 方法应该相应地进行过滤。
您遇到的异常只是指出您的 fetch 方法返回的项目多于 Vaadin 请求的项目(查询参数中的“limit”参数)。这是因为您当前不处理偏移/限制。
您有两种选择来实施您的数据提供程序:
使用列表数据提供者
Vaadin 提供了for 列表ListDataProvider
的实现DataProvider
。分页已经在实现中完成了,你不必关心它。使用该filteringBy
方法根据输入的过滤文本过滤数据。
这种方式更容易,但不可扩展。这意味着如果您有很多项目,您将消耗大量内存和 CPU,因为整个数据都是从后端检索到列表中的。如果您预计商品数量较少,请采用此方法。
或者实现您自己的 DataProvider
您可以实现自己的DataProvider
. 我建议从扩展AbstractBackendDataProvider
类(javadoc)开始。方法sizeInBackend
和fetchFromBackend
需要实施。请注意在 fetch 方法中实现分页的偏移/限制参数。
如果您将分页委托给数据库(例如 SQL 或 no-sql 数据库),则此方法是可扩展的。内存占用会很低,因为您只在内存中保留一页。
添加回答
举报