2011-03-21 34 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

相关问题