1

我开发了一个 Vaadin 应用程序,它必须在其 UI 中处理大量表格。大多数表使用频繁更新的敏感数据。使用 SQLContainers 获取与数据库的连接,因此每个 UI 表都绑定到这些 SQLContainers 之一。其中一些数据库表必须使用不同的过滤器在不同的上下文中显示。UI 主要基于选项卡,因此有时一个数据库表必须同时位于几个选项卡中(但使用不同的过滤器)。我尝试在选项卡选择更改时更新过滤器,但这个解决方案看起来并不干净。

当在任何给定时间只有一个表可见时,在许多地方显示一个数据库表的最佳方法是什么?

4

2 回答 2

2

通常,对于不同的表实例,您有不同的容器。尽管在某些情况下,您可能希望在不同组件之间共享相同的容器实例。只要您了解后果,这是完全可能且可以接受的:过滤和排序是在容器级别完成的,这意味着,如果您在一个视图中对容器应用过滤器,然后导航到另一个视图,则容器将也在那里过滤。不理解这一点可能会导致“奇怪的错误”和大量的 WTF。

共享同一个容器实例的好处在于最大限度地减少应用程序的内存占用——拥有的容器越多,消耗的内存就越多。请注意,表和 SQLContainer 都是延迟加载的 - 这意味着表不会向浏览器呈现比填充表区域(+ 一些缓冲区)所需的更多行,SQLContainer 不会获取比实际更多的行表需要->您的容器实际上不会包含超过几十个项目的内存(*您的里程可能会有所不同)。

从性能角度(CPU)来看,在您的情况下,我认为在多个视图中共享同一个容器实例并没有多大好处,因为每次切换视图时,都需要应用新的过滤器,从而触发新的数据库查询并在每次切换视图时获取所需的数据 - 即使返回到先前已过滤的视图也是如此。

那么最佳实践呢?就个人而言,我会从多个容器实例(每个视图一个)开始,进行一些分析并在需要时进行优化。过早的优化是万恶之源。

于 2013-09-19T19:26:12.463 回答
0

我不相信可以在具有不同过滤器的多个表中使用相同的容器实例 - (不是 100% 肯定,但这是非常强烈的直觉)

考虑到这一点,我倾向于做类似的事情

  1. 创建/使用某种事件总线来广播/订阅消息,说“我已经更新了表 XYZ”
  2. 创建 SQLContainer 的扩展覆盖 #fireContentsChange 以在表更新时进行广播,并且还会对事件总线做出反应,调用 #fireContentsChange(如果事件总线消息的来源不是这个)

使用单个 shared 可能有一种更复杂/更好的方法Container.ItemSetChangeEvent,但是在浏览器文本框中输入内容时很难考虑到这一点。

简而言之,在所有容器上,您希望将 传播ItemSetChangeEvent到所有其他查看同一基础表的容器。

于 2013-09-16T08:47:54.903 回答