java - GWT MVP : HandlerManager EventHandler vs GUI EventHandler

标签 java events gwt gwt-mvp

我正在使用 GWT MVP 来开发应用程序。我看到 GWT MVP 代码中可以有两种事件处理程序,但我不太确定应该在哪个地方使用哪种事件处理程序:

1) AppController 中的 HandlerManager (eventBus) 事件处理程序(例如下面的 EditEventHandler):

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 事件处理程序(例如 ClickHandler),我在其中处理 GUI 事件,然后触发应用程序事件以调用其处理程序,如下所示:

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方法中编写打开新屏幕、调用AsyncService等代码,例如onClick吗?

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

最佳答案

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

将事件视为消息。这是一个例子:
您有一个用于显示记录列表的 View/Presenter 对(即 RecordListPresenter)。用户单击其中一条记录上的编辑按钮,您就有一个单独的 View /演示者对用于编辑特定记录(即 RecordEditPresenter)。而不是从您的 RecordListPresenter 到您的 RecordEditPresenter 进行引用,这将使它们彼此了解并增加 RecordListPresenter 向其发送消息的耦合编辑记录(Edit 事件)。 AppController 将充当 Mediator并打开加载数据并打开 RecordEditEditor (它也只能使用加载的数据触发事件,并且 RecordEditEditor 可以显示自身)。
但现在想象一下,您还有一个 HeaderPresenter 来显示一些面包屑信息(例如正在编辑的记录)。如果您采用“无事件”方法,则需要在 RecordListPresenterRecordEditPresenter 中对其进行另一个引用来驱动它。有了Events,那些Presenters就不必知道有HeaderPresenter。他们只是触发事件。

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

关于java - GWT MVP : HandlerManager EventHandler vs GUI EventHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25216844/

相关文章:

gwt - GWT 的气球小部件

eclipse - 如何在 Eclipse 中使用 GWTBootstrap

java - 在 Java 中将光学等效的 unicode 字符串转换为 ASCII?

java - Vaadin 和 Spring 与 Touchkit。基于 servlet 和注释?

java - 无法在 ubuntu 中编译 servlet

javascript - 动态创建的元素上的事件绑定(bind)?

c# - 从 checkbox_CheckChanged 返回一个值

multithreading - 所有事件驱动的框架都应该是单线程的吗?

javascript - GWT 阻止来源为 "http://localhost"的框架访问跨来源框架

0 到 24 之间的 Java 时间