使用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模式的优势?
答案 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。与原始演示者模式的主要区别在于视图将链接返回到演示者,以便调用其某些方法,而不是演示者向视图注册回调。