我在GWTP中遇到一些问题。
我有一个扩展TabContainerPresenter的MainPresenter。 此演示者链接到MainView,其中包含一些ui组件+一些com.gwtplatform.mvp.client.Tab:HomeTab,ContactTab等。
MainPresenter应该对某些事件做出反应“MyEvent” MyEvent有一个相应的MyHandler,并且是按照这些良好实践http://arcbees.wordpress.com/2010/08/24/gwt-platform-event-best-practice/
创建的当我从MainView的ui组件触发事件时,如下所示:
MyEvent.fire(this, new MyEventContext(..));
我正确地在MainPresenter中捕获了该事件。
但是当我在其中一个“Tab Presenter”中执行完全相同的操作时,MainPresenter不会捕获该事件。
例如,在HomePresenter中,它是MainPresenter的“HomeTab”,当我这样做时
MyEvent.fire(this, new MyEventContext(..));
我可以从HomePresenter捕获事件,但不能从MainPresenter捕获。
有什么想法吗?
答案 0 :(得分:1)
确保您遵守这些规则:
com.google.web.bindery.event.shared.EventBus
(而不是com.google.gwt.event.shared.EventBus
)在处理事件的Presenter(HomePresenter或MainPresenter)中,使用addRegisteredHandler
方法在onBind
生命周期方法中注册事件:
@Override
protected void onBind() {
super.onBind();
addRegisteredHandler(MyEvent.getType(), this);
}
我不知道你做了什么特别的错误。为了帮助您,我制作了a quick proof of concept,其中显示事件可以从选项卡式演示者发送到TabContainerPresenter。克隆这个项目,然后前往#!settingsPage。您将看到两个“Fire true”和“Fire false”按钮,它们将触发将由ApplicationPresenter捕获的事件。
答案 1 :(得分:0)
首先,让我感谢你们这个令人敬畏的POC,它是了解出了什么问题的绝佳基础。我看到我实际上没有以良好的方式使用GWTP。
根本问题是我有2个不同的eventBus 我通过尝试
看到了它Log.info("eventBus: "+eventBus)
在MainPresenter和HomePresenter中。日志显示它们没有相同的哈希码。
这是因为有时我通过以下方式直接访问EventBus:
EventBus.Util.getInstance();
而placeManager实例化为:
DelayedBindRegistry.bind(GWT.create(MyInjector.class))