GWT中的EventBus角色

时间:2011-11-30 13:08:39

标签: gwt event-bus

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

所以在一个问题中:EventBus在GWT中的作用究竟是什么?

3 个答案:

答案 0 :(得分:5)

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

它涵盖了使大型GWT项目更易于管理的简洁技术,例如使用命令模式进行RPC调用,MVP模式,依赖注入以及使用EventBus模式解耦组件。现在有几个GWT框架实现了这些模式,( gwt-dispatch 用于命令模式, gwt-presenter gwt-platform 用于MVP,对于DI来说, GIN& Guice ,但我喜欢EventBus概念的是它是核心GWT框架(HandlerManager)的一部分,所以我不必添加额外的依赖项小型GWT项目。

我认为EventBus概念与 Observer 设计模式有关,因为您正在解耦负责从Presenter组件获取用户输入的View组件,这些组件需要通知这些操作。关键是你的ListBox thingy不必知道对其状态变化感兴趣的所有组件,它只是向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()方法,而不是触发事件。 (或者更糟糕的是:调用所有的refresh() - es,DateRangePicker对象的子组件的onSomethingChange()方法。)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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