GWT,MVP和UIBinding - 如何充分利用所有世界

时间:2010-03-15 16:43:25

标签: gwt mvp

使用MVP,您通常将视图(UI)与Presenter中的Presenter绑定。但是使用最新版本的GWT,特别是使用UIBinding,您可以在视图中执行以下操作:

@UiHandler("loginButton")
void onAboutClicked(ClickEvent event) 
{
    // my login code
}

这基本上为一些快速注释代码交换了许多匿名内部类代码。非常好!!问题是这段代码在视图中而不是演示者......

所以我想也许:

@UiHandler("loginButton")
void onAboutClicked(ClickEvent event) 
{
    myPresenter.onAboutClicked(...);
}

但这种方法存在一些问题。最重要的是,您可以模糊View和Presenter之间的界限。谁在哪些绑定,在某些情况下它是视图,在其他情况下它是演示者(绑定到不在当前视图中但需要附加的事件 - 例如系统范围的更新事件)。

您仍然可以获得对演示者进行单元测试的好处,但需要付出多少代价。责任现在很混乱。例如,绑定有时在“视图”中,其他时间在“演示者”级别中。随着时间的推移,我可以看到代码陷入各种混乱状态。

我还考虑过将Presenter扩展到View,以便您可以在View中执行此操作。这里的问题是你失去了Presenter运行标准单元测试的能力!这是一个重大问题。那条线和线条再次变得模糊。

所以我的问题是,有没有人有一个很好的方法来利用MVP模式中UIBinding的注释而不会模糊线条并失去MVP模式的优势?

5 个答案:

答案 0 :(得分:9)

我倾向于仅在Handler执行特定于视图的内容时使用@UiHandler方法,例如添加样式名称等。出于其他目的(添加验证等),我坚持使用旧方法添加演示者中的适当处理程序。
我建议阅读GWT Google Group关于MVP和UiBinder的许多主题之一,例如this one

答案 1 :(得分:4)

老实说,我并没有多大地使用@UiHandler注释,因为正如你所说,它开始混淆View和Presenter之间的界限。使用它是完全没问题的,如果你不特别关心坚持这种模式,这是一个很好的捷径。

presenter.onAboutClicked()路线绝对是一个选项,但您可以先在演示者中定义处理程序。

答案 2 :(得分:1)

或者如果你正在寻找一个关于如何使其工作的真正实现,请查看blog post,我必须说,直到我发现其他一切仍然是我学习中的噪音。

gwt 2.0.x是对gwt 1.x的一个很大的改进,但我仍然相信谷歌有一些方法可以使用他们的文档和指导,因为我们已经看到uibinder和mvp,它在如何留下了很多想象力使事情有效。

希望链接对你需要的东西有所了解。

答案 3 :(得分:0)

如果使用MVP模式,您的SomeView界面应该定义一个内部Presenter接口,然后由您的演示者(Activity类)实现。因此,在视图中执行以下操作:

interface SomeView extends IsWidget
   public interface Presenter{
          ...all the methods
          public void doSomeAction(SomeView view);
   }

  ...view methods
}

现在在SomeViewImpl类中,附加一个处理程序

@UiHandler("some_button")
void onClickSomeButton(ClickEvent e){
     // call the presenter method (you have access to it in the ViewImpl class
     presenter.doSomeAction(this);
}

看起来有点长,但模式效果很好。

答案 4 :(得分:0)

视图通常使用有时被称为“监督控制器”的模式将其某些操作委托给演示者。

Google也提倡这是一种很好的方式,可以在您使用时使用@UiHandler注释!@ UiBinder。与原始演示者模式的主要区别在于视图将链接返回到演示者,以便调用其某些方法,而不是演示者向视图注册回调。

https://github.com/ArcBees/GWTP/wiki/UiHandlers