2016-07-15 106 views
1

如何获得com.google.web.bindery.event.shared.EventBus实例在com.google.gwt.user.client.ui.Composite扩展类?如何获取复合扩展类中的EventBus实例?

我readed:How to use EventBus for non-Presenter class in GWTP?,但我期待像答案:

BEST方法GWT开发

我的小工具,我想触发一个事件IndicatorEvent。但在这个小部件中,我没有这个事件的处理程序。

处理程序在其他类中。因此,要启动它,我将使用:

fireEvent(new IndicatorEvent("Custom Widget Message")); 

方法fireEvent是avalible在com.google.web.bindery.event.shared;EventBus

public abstract void fireEvent(Event<?> event);

所以,我需要在扩展Composite视图类的一个实例EventBus。这个视图没有MVP的东西(演示者,uihandlers等),它只是一个类元素/小部件。

我应该采取什么方法?

  • 我应该将其转换为Presenter/View对吗? (在gwtp主持人是从PresenterWidget类的EventBus参考)然后使用ui处理程序,委托执行从视图到演示者?
  • 我应该inject实例EventBus转换成widget类吗?

请帮忙。

回答

0

我们只能为每个视图分配单个组件。所以首先做法没有任何意义,因为我们为特定视图的所有小部分创建了大量组件/小部件。如果我们已经使用像杜松子酒或dagger2一些依赖注入框架

第二种方法相对更讨人喜欢。

我可以添加一个方法是让在组分简单setter方法用于从像演示者或控制器,我们使用的是父类传递eventBus实例/创建组件对象。

我的结论绝对取决于组件的目的和实现。如果我们有接口实现或演示者实现类型的组件,说明一些常见行为,第二种方法是最合适的方式。另一方面,如果我们有简单的平面组件作为小部分视图,我会推荐第三种方法。

2

任何小组件都可以在不使用EventBus的情况下触发事件。

如果你知道这个事件的接收者,你可以简单地直接连接处理器给收件人。要做到这一点,你在你的组合构件定义这个方法:

public HandlerRegistration addIndicatorEventHandler(IndicatorEventHandler handler) { 
    return addHandler(handler, IndicatorEvent.TYPE); 
} 

,然后在其他窗口小部件(收件人):

myCustomWidget.addIndicatorEventHandler(new IndicatorEventHandler() { 

    @Override 
    public void onIndicator(IndicatorEvent event) { 
     // do something 
    } 

}); 

您将需要使用EventBus如果(a)不存在两个小部件(触发事件和事件接收者)之间的直接/简单链接,(b)有许多收件人,和/或(c)您不想在包含事件触发小部件和事件的代码部分之间创建依赖关系收件人。