1

在我见过的大多数活动和地点示例中,人们使用 SimplePanel 作为 ActivityManager 的显示。

我想知道使用 DeckPanel/DeckLayoutPanel 而不是 SimplePanel 是否有好处。围绕实现 AcceptsOnWidget 的 Deck 面板创建包装器相当简单。

我还没有看到任何地方讨论过这个话题。在 GWT 中普遍使用 MVP+Activity 之前,人们通常使用 Tab 面板(内部使用甲板类型面板)和 Deck 面板来控制给定视图内面板之间的切换。

两者之间的区别是 SimplePanel.setWidget(..) 将从 DOM 中删除前一个子元素并附加新的小部件,而甲板类型面板将使用 CSS 来控制当前面板的可见性(即“显示:无”隐藏非活动面板)。

  1. 如果使用甲板面板,通常意味着您将在 DOM 中拥有更多元素。我想这会使用更多的内存并使应用程序“缓慢”,即使这些节点不可见(“显示:无”)。这是真的?

  2. 如果这是真的,为什么 Google 为 TabPanel/TabLayoutPanel 使用甲板面板样式 impl 而不是在内部使用 SimplePanel?

  3. 一种方法比另一种方法更有利吗?

4

2 回答 2

3

性能方面没有区别。这一切都取决于你如何使用它。在 DeckLayoutPanel 中,所有子项都保存在内存中。但是,如果您要使用 SimplePanel 实现相同的功能,您需要自己保留指向这些相同子级的指针,因此内存占用量将大致相同。除非使用 SimplePanel,您每次显示并渲染一个子对象并在隐藏时将其丢弃,这可能会提高内存效率(如果垃圾收集器有效),但由于渲染成本高昂,因此会影响可用性。

其次,如果您使用 DeckLayoutPanel,它的所有子项都会立即创建,而只显示一个。对于性能,这可能不是最佳的。因此,出于这个原因,您可以在子级和 DeckLayoutPanel 之间添加一个 LazyPanel,因此它仅在显示时创建。但这可能需要一些额外的编码才能使其工作(因为它很懒,您需要延迟初始化它,这可能会导致一些困难)但是,对于 DeckLayoutPanel 和 SimplePanel 之间的比较,这只是您何时为SimplePanel(所有前面 == 与 DeckLayoutPanel 相同的问题),而不是特定于 DeckLayoutPanel 和 SimplePanel 之间差异的问题。

In general if you have a defined ordered set of children use a DeckLayoutPanel (like with a TabPanel) and if you have a undefined set SimplePanel is the better choice (like in MVP to show the current view).

于 2011-09-14T06:54:51.610 回答
0

DeckLayoutPanel 在内部保存所有视图(实际上是您已注册或显示的视图)的集合,以便能够确定滑动动画方向(取决于您是向后还是向前)。除此之外,我没有注意到从 SimplePanel 切换到 DeckLayoutPanel 时应用程序变得迟缓。当您的所有视图都是单例时,它特别安全。但请注意,在这种情况下,当在同一个视图实例之间切换时(例如主类别列表 -> 子类别列表),DeckLayoutPanel 渲染滑动动画时可能会出现一些问题。

在我看来,没有有利的解决方案——如果你不需要“滑动”面板,我不会使用 DeckLayoutPanel(因为所有额外的组件都会增加复杂性)。

于 2011-09-13T20:25:41.310 回答