我正在使用GWT MVP开发一个应用程序。我看到我们可以在GWT MVP代码中使用两种事件处理程序,但我不确定应该在哪个位置使用哪种事件处理程序:
1) HandlerManager (eventBus) EventHandlers (例如,下面的EditEventHandler )在AppController中
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事件,然后启动应用程序事件来调用其处理程序,如下所示:
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代码之间来回切换?
发布于 2014-08-10 19:31:49
AsyncService中调用EventHandler。只需确保您在您的Presenter而不是在您的View中这样做。然而,应用程序越复杂,这种方法就会变得越混乱。您将有许多AsyncService调用分散在您的各种Presenters上。这可能是一种更好的方法,可以在AppController中将它们分组,这样就有了1)。(一处可供寻找的地方和二处您可以轻松地测试/模拟您的AsyncService中的所有AppController调用。Presenter中完成的工作也应该在那里完成,而不需要通过AppController或返回。但是,将AsyncService调用放入AppController可能仍然有意义,因为您可能需要执行一些引导操作(例如,在LocalStroage中缓存结果、提交其他事件等)和/或通知其他屏幕/组件所加载的数据。把事件看作是信息。下面是一个示例:
您有一个视图/演示器对,用于显示记录列表(即RecordListPresenter)。用户单击其中一条记录上的“编辑”按钮,您将有一个单独的视图/演示器对来编辑特定的记录(即RecordEditPresenter)。RecordListPresenter没有引用您的RecordEditPresenter (这将使它们彼此了解并增加耦合),而是发送一条消息来编辑记录(Edit事件)。AppController将充当一个中介人,并打开加载数据并打开RecordEditEditor (它也只能用加载的数据触发事件,而RecordEditEditor可能会显示自己)。
但是现在假设您还有一个HeaderPresenter来显示一些面包屑信息(比如它正在编辑的记录)。如果采用“无事件”方法,则需要RecordListPresenter和RecordEditPresenter中的另一个引用来驱动它。对于Events,Presenters不需要知道有一个HeaderPresenter。他们只会引发事件。
现在,在一个复杂的应用程序中,你可能有许多独立的单元。
https://stackoverflow.com/questions/25216844
复制相似问题