我正在使用 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
代码之间来回切换?
最佳答案
- 您可以这样做,并且在小型应用程序中这可能是正确的方法。然而,您肯定会增加 GUI、业务逻辑和各种组件之间的耦合。您应该将屏幕设想为独立的单元,并避免这些单元之间的任何耦合。在最好的情况下,显示记录列表的屏幕应该不知道其他屏幕或任何其他组件。它应该只关心那些记录。
- 从技术上讲,您没有理由不能在 GUI EventHandler 中调用
AsyncService
。只需确保您在Presenter
中执行此操作,而不是在View
中执行此操作。然而,您的应用程序越复杂,这种方法可能会变得越困惑。您将在各种Presenter
上散布许多 AsyncService 调用。将它们分组到您的AppController
中可能是一种更好的方法,因此 1.) 可以寻找一个地方,2.) 您可以轻松测试/模拟所有AsyncService
调用在您的AppController
中。 - 可以在
Presenter
内完成的工作也应该在那里完成,而无需通过AppController
来回。然而,将AsyncService
调用放入您的AppController
中仍然可能有意义,因为您可能需要进行一些簿记操作(例如在LocalStroage
中缓存结果) >,提交其他事件等)和/或通知其他屏幕/组件有关加载的数据。
将事件视为消息。这是一个例子:
您有一个用于显示记录列表的 View/Presenter 对(即 RecordListPresenter
)。用户单击其中一条记录上的编辑按钮,您就有一个单独的 View /演示者对用于编辑特定记录(即 RecordEditPresenter
)。而不是从您的 RecordListPresenter
到您的 RecordEditPresenter
进行引用,这将使它们彼此了解并增加 RecordListPresenter
向其发送消息的耦合编辑记录(Edit
事件)。 AppController
将充当 Mediator并打开加载数据并打开 RecordEditEditor
(它也只能使用加载的数据触发事件,并且 RecordEditEditor
可以显示自身)。
但现在想象一下,您还有一个 HeaderPresenter 来显示一些面包屑信息(例如正在编辑的记录)。如果您采用“无事件”方法,则需要在 RecordListPresenter
和 RecordEditPresenter
中对其进行另一个引用来驱动它。有了Events
,那些Presenters
就不必知道有HeaderPresenter
。他们只是触发事件。
现在,在一个复杂的应用程序中,您可能有许多这样的独立单元。
关于java - GWT MVP : HandlerManager EventHandler vs GUI EventHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25216844/