我有一个带有基于复杂查询填充数据的表的页面(即使我使用分页也需要很多时间)。我使用 BeanItemcontainer 将数据加载到表中。现在遇到问题,我希望以异步方式将数据加载到表中(在用户屏幕上加载完整页面之后。我想填充数据)。是否有类似 onPageLoad 事件或 onPageRenderEvent 或等效的东西可以用来实现这一点?
细节 -
版本 - Vaadin -7.0
组件 - 表
数据容器 - BeanItemContainer。
我有一个带有基于复杂查询填充数据的表的页面(即使我使用分页也需要很多时间)。我使用 BeanItemcontainer 将数据加载到表中。现在遇到问题,我希望以异步方式将数据加载到表中(在用户屏幕上加载完整页面之后。我想填充数据)。是否有类似 onPageLoad 事件或 onPageRenderEvent 或等效的东西可以用来实现这一点?
细节 -
版本 - Vaadin -7.0
组件 - 表
数据容器 - BeanItemContainer。
有很多方法可以解决这个问题,但你必须决定如何解决这个问题。这是我知道的两个:
1) 来自客户的请求。
2)从服务器推送。(技术上仍然是来自客户的请求)
1 -- A) 来自客户端编程的 Javascript 函数的请求。使用Javascript 扩展或Javascript 组件将组件附加到布局,并通过调用服务器端 API 函数发出请求。然后,您可以在该请求中更新表,而不必担心同步问题。
1 -- B) 制作自己的 GWT / Vaadin 小部件(基本上是一样的)来做 1A。
2 -- A) 来自“服务器端”编程的 Vaadin 组件的请求。制作轮询服务器的可见(或不可见)进度指示器。在后台线程中填充表格,Vaadin 将发送您当前收集的数据。进度指示器可以多次执行此操作,并且表只会将差异发送到客户端代码(称为增量)。小心从后台线程更新面向客户端的组件;您需要同步对组件的更改以避免并发修改错误。
2 -- B) 向应用程序添加复习,并按照上面的 2A 进行操作,而不需要进度指示器。
任何一种解决方案都需要您在后台线程 (2A,B) 或从客户端 (1A,B) 调用的服务器方法中显式更新表。两者在技术上都是基于客户请求的。Vaadin 团队正在努力增加真正的“推动”。
Vaadin 解决这个问题的方法是使用延迟加载 Container。Vaadin 有几个延迟加载容器可用:核心中的 SQLContainer、LazyQueryContainer和JPAContainer。