首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT MVP: HandlerManager EventHandler vs GUI EventHandler

GWT MVP: HandlerManager EventHandler vs GUI EventHandler
EN

Stack Overflow用户
提问于 2014-08-09 08:51:29
回答 1查看 237关注 0票数 0

我正在使用GWT MVP开发一个应用程序。我看到我们可以在GWT MVP代码中使用两种事件处理程序,但我不确定应该在哪个位置使用哪种事件处理程序:

1) HandlerManager (eventBus) EventHandlers (例如,下面的EditEventHandler )在AppController

代码语言:javascript
复制
eventBus.addHandler(EditEvent.TYPE,
      new EditEventHandler() {
        public void onEdit(EditEvent event) {
          doEdit(event.getId()); // this would open a new screen, call AsyncService etc
        }
      });

据我所知,这种事件处理程序用于处理应用程序范围内的自定义事件。

2) Presenter中的GUI/View事件处理程序(例如Presenter),其中我处理GUI事件,然后启动应用程序事件来调用其处理程序,如下所示:

代码语言:javascript
复制
display.getList().addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
      int selectedRow = display.getClickedRow(event);

      if (selectedRow >= 0) {
        String id = myDetails.get(selectedRow).getId();
        eventBus.fireEvent(new EditEvent(id)); // this in turn would invoke the EditEventHandler above
      }
    }
  });

现在,我的问题是:

1)为什么我们需要为应用程序事件编写EventHandler (例如EditEvent),而不直接在相关的GUI事件处理程序(例如addClickHandler)中添加该代码?

(2)我们不能直接用图形用户界面( GUI EventHandler )方法(如onClick )编写打开新屏幕、调用onClick等的代码吗?

3)这难道不让您的代码更加可读性,因为触发的事件和需要完成的工作都在一个地方,即Presenter,而您不必在Presenter代码和AppController代码之间来回切换?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-10 19:31:49

  1. 您可以这样做,在小型应用程序中,这可能是正确的方法。但是,您肯定会增加GUI、业务逻辑和各种组件之间的耦合。您应该将屏幕想象成独立的单元,并避免这些单元之间的任何耦合。在最好的情况下,显示记录列表的屏幕不应该了解其他屏幕或任何其他组件。它应该只关心那些记录。
  2. 从技术上讲,您没有理由不能在GUI AsyncService中调用EventHandler。只需确保您在您的Presenter而不是在您的View中这样做。然而,应用程序越复杂,这种方法就会变得越混乱。您将有许多AsyncService调用分散在您的各种Presenters上。这可能是一种更好的方法,可以在AppController中将它们分组,这样就有了1)。(一处可供寻找的地方和二处您可以轻松地测试/模拟您的AsyncService中的所有AppController调用。
  3. 可以在Presenter中完成的工作也应该在那里完成,而不需要通过AppController或返回。但是,将AsyncService调用放入AppController可能仍然有意义,因为您可能需要执行一些引导操作(例如,在LocalStroage中缓存结果、提交其他事件等)和/或通知其他屏幕/组件所加载的数据。

把事件看作是信息。下面是一个示例:

您有一个视图/演示器对,用于显示记录列表(即RecordListPresenter)。用户单击其中一条记录上的“编辑”按钮,您将有一个单独的视图/演示器对来编辑特定的记录(即RecordEditPresenter)。RecordListPresenter没有引用您的RecordEditPresenter (这将使它们彼此了解并增加耦合),而是发送一条消息来编辑记录(Edit事件)。AppController将充当一个中介人,并打开加载数据并打开RecordEditEditor (它也只能用加载的数据触发事件,而RecordEditEditor可能会显示自己)。

但是现在假设您还有一个HeaderPresenter来显示一些面包屑信息(比如它正在编辑的记录)。如果采用“无事件”方法,则需要RecordListPresenterRecordEditPresenter中的另一个引用来驱动它。对于EventsPresenters不需要知道有一个HeaderPresenter。他们只会引发事件。

现在,在一个复杂的应用程序中,你可能有许多独立的单元。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25216844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档