Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT、MVP和UIBinding—如何充分利用所有世界_Gwt_Mvp - Fatal编程技术网

GWT、MVP和UIBinding—如何充分利用所有世界

GWT、MVP和UIBinding—如何充分利用所有世界,gwt,mvp,Gwt,Mvp,使用MVP,您通常会将视图(UI)与演示者中的演示者绑定。但是,对于最新版本的GWT,尤其是UIBinding,您可以在视图中执行以下操作: @UiHandler("loginButton") void onAboutClicked(ClickEvent event) { // my login code } 它基本上是将大量匿名内部类代码交换为一些快速注释代码。很不错的!!问题是此代码在视图中,而不是演示者 所以我想也许: @UiHandler("loginButton") voi

使用MVP,您通常会将视图(UI)与演示者中的演示者绑定。但是,对于最新版本的GWT,尤其是UIBinding,您可以在视图中执行以下操作:

@UiHandler("loginButton")
void onAboutClicked(ClickEvent event) 
{
    // my login code
}
它基本上是将大量匿名内部类代码交换为一些快速注释代码。很不错的!!问题是此代码在视图中,而不是演示者

所以我想也许:

@UiHandler("loginButton")
void onAboutClicked(ClickEvent event) 
{
    myPresenter.onAboutClicked(...);
}
但这种方法存在几个问题。最重要的是,模糊了视图和演示者之间的界限。谁进行绑定,在某些情况下是视图,在另一些情况下是演示者(绑定到当前视图中不存在但需要附加的事件,例如系统范围的更新事件)

您仍然可以获得单元测试演示者的好处,但代价是什么。现在的责任是混乱的。例如,绑定有时在视图中,有时在演示者级别。我可以看到代码随着时间的推移陷入各种混乱

我还考虑将Presenter扩展到视图,以便您可以在视图中执行此操作。这里的问题是您失去了演示者运行标准单元测试的能力!这是个大问题。那条线又变得模糊了


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

老实说,我不太使用
@UiHandler
注释,因为正如你所说,它开始混淆视图和演示者之间的界线。这是一个很好的使用方法,如果你不特别在意如何坚持模式的话,这是一个很好的捷径


presenter.onAboutClicked()
路由无疑是一个选项,但您最好首先在presenter中定义处理程序。

我倾向于仅当处理程序确实查看特定内容时才使用
@UiHandler
方法,例如添加样式名称等。用于其他目的(添加验证等),我坚持在演示者中添加适当处理程序的旧方法。

我建议您通读GWT Google Group上许多关于MVP和UiBinder的帖子中的一条,例如。

或者如果您正在寻找一个真正的实现方法来实现它,请检查一下,我不得不说,直到我发现它之前,我的学习中的其他一切都是噪音

GWT2.0.x是对GWT1.x的一个巨大改进,但我仍然相信谷歌在文档和指导方面还有一定的路要走,因为正如我们在uibinder和mvp中看到的那样,它在如何使事情运转方面留下了很多想象


希望链接对你需要的东西有更多的了解

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

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);
}

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

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

这也是谷歌提倡的一种很好的方式,当你使用它的时候,你可以使用它的nice@UiHandler注释!尤宾德。与原始presenter模式的主要区别在于,视图保留一个指向presenter的链接,以便调用其某些方法,而不是presenter注册对视图的回调


最后一部分不是真的-每个视图/类可以有多个
@UiHandlers
-这就是小部件的名称-告诉编译器要向哪个小部件注册该处理程序。您可以使用任何方法名称(但要使用适当的参数,例如,对于ClickHandler,您应该使用
(ClickEvent事件)
等)。哦,太酷了。我认为该方法必须命名为onClick才能起作用。就像我说的,我从来没有因为其他原因真正使用过@UiHandlers,但我现在可能更可能。。。