使用容器的最佳做法

时间:2013-09-16 07:55:41

标签: user-interface containers vaadin

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

那么这个最佳实践怎么样?就个人而言,我将从多个容器实例(每个视图一个)开始,根据需要进行一些分析和优化。过早优化是万恶之源。

答案 1 :(得分:0)

我不相信可以在具有不同过滤器的多个表中使用相同的容器实例 - (不是100%肯定,但它本能很强)

考虑到这一点,我倾向于做一些像

这样的事情
  1. 创建/使用某种事件总线来广播/订阅消息“我已更新表XYZ”
  2. 创建SQLContainer扩展时覆盖#fireContentsChange以在更新表时进行广播,并且还响应事件总线,调用#fireContentsChange(如果事件总线消息不是这样)
  3. 使用单个共享Container.ItemSetChangeEvent可能有更复杂/更好的方法,但在浏览器文本框中输入时要考虑到这一点很棘手。

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

相关问题