我有一个带有表格的页面,该表格根据复杂查询填充数据(即使我使用分页,也需要花费大量时间)。我使用 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。
您可以在 JavaScript 中添加加载事件监听器并等待它被触发。一个简单的方法是定义一个 Java 方法来接收
Runnable
作为参数并在页面加载时运行它。
void onLoad(Runnable runnable) {
Page page = UI.getCurrent().getPage();
page.executeJs("window.addEventListener('load', () => {} );")
.then( (event) -> runnable.run() );
}
你可以这样使用它:
onLoad( () -> Notification.show("Page loaded") );
使用 Vaadin 24.3.2 进行测试