9

我在 GWT 中使用 EventBus 阅读了这个很酷的事件处理,到目前为止我真的很喜欢它。但我并没有真正掌握这个概念什么时候应该使用它。每时每刻?我可以过度使用它吗?我应该将它用于与事件相关的所有事情吗?(就像 MVP 中的视图和演示者层之间的通信?或者我可以将它与 onMouseMove 事件一起使用吗?它有多重量级?)

那么问题来了:EventBus 在 GWT 中究竟扮演什么角色?

4

3 回答 3

5

您可能已经看过这个 Google I/O 演示文稿:Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App

它涵盖了使大型 GWT 项目更易于管理的巧妙技术,例如使用 RPC 调用的命令模式、MVP 模式、依赖注入以及使用 EventBus 模式解耦组件。现在有几个 GWT 框架实现了这些模式,(gwt-dispatch用于命令模式,gwt-presentergwt-platform用于 MVP,GIN 和 Guice用于 DI)但我喜欢 EventBus 概念的一点是它是核心 GWT 框架 ( HandlerManager),因此我不必为较小的 GWT 项目添加额外的依赖项。

我认为 EventBus 概念与观察者设计模式有关,因为您将负责从需要通知这些操作的 Presenter 组件中获取用户输入的 View 组件解耦。关键是您的 ListBox 不必知道对其状态更改感兴趣的所有组件,它只是向 EventBus 触发一个事件,感兴趣的组件将接收该事件并按照他们的意愿行事。

不过,我认为您不必总是通过 HandlerManager 实例来做事。假设您有一个自定义DateRangePicker小部件,可让用户选择自定义日期范围。每当挑选日期范围时,窗口小部件都可以在其onSomethingChanged()方法中执行类似的内容:

NativeEvent event = Document.get().createChangeEvent();
DomEvent.fireNativeEvent(event, this);

然后,对日期范围选择更改感兴趣的组件只需将处理程序回调注册到 DateRangePicker 小部件实例。

dateRangePicker.addDomHandler(new ChangeHandler(){
    @Override
    public void onChange(ChangeEvent event) {
        refresh();
    }
}, ChangeEvent.getType());

我认为这是一个很好的松耦合设计,它不使用HandlerManager实例。

一个糟糕的设计是在 DateRangePicker 的 onSomethingChange() 方法中调用所有感兴趣的组件的refresh()方法,而不是触发事件。(或者更糟糕的是:在 DateRangePicker 对象的子组件的 onSomethingChange() 方法中调用所有的 refresh()-es。)

于 2011-11-30T13:52:52.563 回答
3

我认为将全局EventBus用于单个小部件的 MVP 部件之间的内部通信有点过度使用。这将使您的小部件依赖于事件总线。(如果事件总线不在核心 GWT 中,那显然更不可接受。)我认为事件总线是应用程序不同部分的不同小部件之间的通信媒介。

于 2011-12-01T10:03:40.970 回答
2

在视图和演示者之间使用它是没有用的,而不是让演示者直接调用视图方法。

我相信当组件不相互引用时,EventBus 是好的,例如 2 个不同屏幕的演示者。

于 2011-11-30T13:19:02.677 回答