GWT:如何从视图触发自定义事件并由活动使用
我无法在活动中接收自定义事件。谁能告诉我我错过了什么?我正在使用GWT2.1、MVP模式和UiBinder 以下是我所写内容的示例: 假设我有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 { .
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新手,可能是我错过了一些其他方面。