Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT:如何从视图触发自定义事件并由活动使用_Gwt_Event Handling_Mvp_Uibinder - Fatal编程技术网

GWT:如何从视图触发自定义事件并由活动使用

GWT:如何从视图触发自定义事件并由活动使用,gwt,event-handling,mvp,uibinder,Gwt,Event Handling,Mvp,Uibinder,我无法在活动中接收自定义事件。谁能告诉我我错过了什么?我正在使用GWT2.1、MVP模式和UiBinder 以下是我所写内容的示例: 假设我有MyCustomEvent类及其处理程序接口MyCustomEventHandler及其onMyCustomEvent(MyCustomEvent事件)方法 我在活动中实现处理程序接口: class MyActivity extends AbstractActivity implements MyCustomEventHandler { .

我无法在活动中接收自定义事件。谁能告诉我我错过了什么?我正在使用GWT2.1、MVP模式和UiBinder

以下是我所写内容的示例:

假设我有
MyCustomEvent
类及其处理程序接口
MyCustomEventHandler
及其
onMyCustomEvent(MyCustomEvent事件)
方法

我在活动中实现处理程序接口:

    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);

            }

        });

         }

}
公共类MyWidget扩展了复合{
最终PopUpPanel myPopUp;
公共MyWidget(){
initWidget(uiBinder.createAndBindUi(this));
myPopUp.addCloseHandler(新的CloseHandler(){
@凌驾
公共void onClose(CloseEvent事件){
MyEvent事件=新的MyEvent();
火灾事件(事件);
}
});
}
}
没有引发异常,不幸的是,
MyActivity
类中从未调用过
onMyCustomEvent
。有什么想法吗?非常感谢。

@MyWidget

您可以使构造函数接受参数(eventBus) 您可以从MyActivity类中传递此信息

所以当你启动@MyActivity事件时 该操作将在@MyWidget处执行


试试这个,我想它会起作用。

我想你的一条评论在这里为你指明了正确的方向。我将猜测的是,您有多个
EventBus
浮动(每个应用程序通常只有一个事件总线)

首先,确保Gin模块中的
EventBus
绑定在
Singleton
范围内。另外,确保这是传递给
PlaceController
的事件总线,而不是您自己构建的事件总线


另外,我也不会太担心您的对象在一个地方是一个
ResettableEventBus
。我相信这只是一个由Activities/Places框架创建的对象,它只包装了您提供的
EventBus
对象。

谢谢,我们也解释了您的方法。但就我的理解而言,我不明白为什么我的方法不起作用。我做了更多的调试。结果在我看来很奇怪。在start()方法中传递的eventBus实现与注入的不同。事实上,我注入了一个SimpleEventBus,但在start()方法中使用了ResettableEventBus。我移动了eventBus.addHandler(MyEvent.TYPE,this);到活动构造函数,该构造函数将eventBus作为参数。这可以确保eventBus对象与onModuleLoad()附带的对象相同。尽管如此,接收者仍然没有被转移!我真的做不到。谢谢你的评论。事实上,一切都如你所描述的那样。我找到了一个解决问题的方法,省去了自定义事件创建方法:我发现我可以利用小部件中的内置事件来获得相同的解决方案。我也承认我是一个GWT新手,可能是我错过了一些其他方面。