2011-03-21 32 views
1

我無法在活動中接收自定義事件。任何人都可以告訴我我錯過了什麼?我正在使用GWT 2.1,MVP模式和UiBinder。GWT:如何從視圖中觸發自定義事件並使用活動

這裏是我寫的一個樣本:

比方說,我有MyCustomEvent類和它的處理程序接口MyCustomEventHandleronMyCustomEvent(MyCustomEvent event)方法。

我執行活動中的處理程序接口:

class MyActivity extends AbstractActivity implements MyCustomEventHandler { 
    .... 

     public void onMyCustomEvent(MyCustomEvent event) { 
     doWhatYouKnow(); 

     } 

     //EventBus is injected with GIN 
     public void start(AcceptsOneWidget container, EventBus eventBus) { 


     ...   
     eventBus.addHandler(MyEvent.TYPE, this); 


    }  



} 

現在,在視圖中的發送部分:

public class MyWidget extends Composite { 

    final PopUpPanel myPopUp; 

     public MyWidget() { 
      initWidget(uiBinder.createAndBindUi(this)); 

      myPopUp.addCloseHandler(new CloseHandler<PopupPanel>() { 

      @Override 
      public void onClose(CloseEvent<PopupPanel> event) { 

         MyEvent event = new MyEvent(); 
       fireEvent(event); 

      } 

     }); 

     } 

} 

也不例外拋出可惜onMyCustomEventMyActivity類不會被調用。任何想法?太感謝了。

回答

0

@MyWidget

可以使構造函數取參數(eventBus) 你可以從類MyActivity

所以通過這個,當你觸發事件@MyActivity 的動作將被執行@MyWidget

試試這個,我認爲它會工作。

+0

謝謝,你的方法也解釋了[這裏](http://stackoverflow.com/questions/3946242/passing-an-object-to-the-constructor-of-a-widget-defined-in-uibinder) 。但就我的理解而言,我不明白爲什麼我的方法行不通。 – 2011-03-21 13:36:56

+0

我做了一些更多的調試。其結果似乎對我來說很奇怪。在start()方法中傳遞的eventBus實現與注入的不一樣。事實上,我注入了一個SimpleEventBus,但在start()方法中使用了ResettableEventBus。我移動了eventBus.addHandler(MyEvent.TYPE,this);到Activity構造函數,它將eventBus作爲參數。這確保eventBus對象與onModuleLoad()一起提供。儘管如此,接收器仍然未被觸發!我真的無法完成這件事。 – 2011-03-21 13:51:30

0

我認爲你的一條評論是指向你在這裏正確的方向。我要猜測的是你有多於一個的EventBus浮動(通常應該只有一個事件總線每個應用程序)。

首先,確保您的杜松子酒模塊中的EventBus綁定在Singleton範圍內。此外,請確保這是您傳遞到您的PlaceController的事件公交車,而不是您自己構建的公交車。

此外,我不會太擔心你的對象是在一個地方ResettableEventBus的事實。我相信這只是一個由Activities/Places框架創建的對象,它只包含您給它的EventBus對象。

+0

感謝您的評論。其實一切都如你所描述的那樣。我找到了解決方法來解決我的問題,而忽略了自定義事件創建方法:我發現我可以利用小部件中的內置事件實現相同的解決方案。我也承認我是GWT新手,可能是我錯過了其他一些部分。 – 2011-03-22 08:42:48

相關問題