2016-07-15 42 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)您不想在包含事件觸發小部件和事件的代碼部分之間創建依賴關係收件人。