GWT: AcceptsOneWidget vs Composite vs IsWidget

8

GWT有许多名字相似(看起来目的也相似)的类型:

  • Widget(组件)
  • AcceptsOneWidget(接受一个组件)
  • Composite(复合组件)
  • IsWidget(是组件)
  • SimplePanel(简单面板)

在什么时候/何处使用它们是适当的? 它们与RootPanel的关系是什么?

2个回答

11

让我们先将接口与类分离。

接口非常适用于模拟(mocking)(从而允许在不需要笨重的GWTTestCase的情况下测试您的应用程序):

  • IsWidget:当您只需要一个小部件(widget)的handle,而不依赖于Widget类时。这通常与MVP一起使用,作为表示view的一种方式。
  • AcceptsOneWidget:当您需要一个单个小部件(widget)的占位符(以IsWidget的形式)时。这通常与Activities一起使用,将view(IsWidget)插入给定的slot(AcceptsOneWidget)中。

您列出的所有类都扩展了Widget,因此它们依赖于JSNI,(大多数情况下)需要在GWT环境中运行(对于单元测试,这意味着需要一个GWTTestCase):

  • Widget:所有小部件(widget)的基础。实现了IsWidget,从asWidget()返回自身。
  • Composite:当您需要创建一个由其他部件构建而隐藏其实现的小部件时,可以使用此基类。虽然您可以扩展现有的组件,但通常最好将其隐藏在Composite中,以便仅公开您需要/想要公开的API。 Composite是关于“组合而不是继承”和封装。标准小部件中复合的示例包括TabPanel(由TabBarDeckPanel构建)、DateBox(在PopupPanel中由TextBoxDatePicker构建)、ValueListBox,它包装了一个ListBoxValuePicker,后者包装了一个CellList。在许多情况下,鉴于面板接受IsWidget子元素,您可以简单地实现IsWidget而不是扩展Composite,但有时具有真正的小部件很有用。
  • SimplePanel是一个实现AcceptsOneWidget的面板,在使用活动时非常有用(但您也可以轻松实现AcceptsOneWidget以插入任何类型的面板)
  • 话虽如此,谷歌最近开源了GWT-Mockito,将Mockito插入到GWT.create()中,并使用类加载器魔法重写JSNI方法并删除final修饰符,以便您可以直接在测试中使用小部件,而无需使用GWTTestCase或MVP。

    综上所述,这取决于你如何处理你的代码,如何架构你的应用程序。如果你使用MVP,请在你的presenter中只依赖于接口(例如:IsWidgetAcceptsOneWidget),以便在测试中轻松模拟你的视图。
    否则,如果你想要一个“简化的MVP”,其中视图是UiBinder模板,请尝试使用GWT-Mockito进行测试并直接使用小部件。
    当然,在同一个应用程序中,您可以混合使用两种方法。无论如何,对于低级别的事情(很少需要),请将自己的小部件构建为Widget,而对于其他所有内容,请使用 CompositeIsWidget,而不是扩展现有的小部件。


    4
    你弄混了。
    小部件:它允许您与用户进行交互。 (例如按钮
    面板:这些是可以包含其他面板/小部件的小部件。可以称为小部件的容器。
    AcceptsOneWidget:由将仅接受一个小部件的面板实现。 (例如SimplePanel
    复合:一种小部件类型,可以包装另一个小部件,并隐藏封装小部件的方法。组合对于在单个面板中包含多个其他小部件的聚合中创建单个小部件很有用。
    IsWidget:几乎所有已知小部件都实现了该接口。它提供对该小部件的访问。
    SimplePanel:仅包含一个小部件的面板。
    RootPanel:是添加所有其他面板的基本面板。

    感谢@Kaushik (+1) - 有几个后续问题:(1)面板和复合组件似乎都是1个或多个小部件的容器:那么在什么情况下使用它们是合适的? (2)将1个或多个面板添加到根面板中是否需要才能在浏览器中显示UI?再次感谢! - user1768830
    1
    1. 组合件不是容器,而是包装器。基本上,您可以使用它们来创建自定义小部件。面板用于添加小部件。
    2. 您可以将一个或多个面板添加到根面板中,但我建议您使用Flow面板(HTML Div等效)或VerticalPanel(HTML表格等效)作为容器,并将该容器添加到RootPanel中。
    - Kaushik

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接