我刚刚完成了我的第一个自己的活动/场所和MVP示例。一切正常但如果我换回一个地方(从另一个地方),某些事件不会发送或接收。但在“moduleLoad”这个地方设置为默认位置一切正常。我认为如果在moduleLoad上启动一个地点/活动(通过historyHandler = new PlaceHistoryHandler(historyMapper); historyHandler.register(placeController,eB,defaultPlace); historyHandler.handleCurrentHistory();)或通过placeController,它应该没有区别。 GOTO(地点); ,是吗?
通过调试我检查了事件注册,事件发送和事件接收的顺序(所有都在活动的开始(...)执行)。问题是如果通过goTo(地点)执行start(),所有接收者都不会收到事件(注册和发送工作正常)。但是如果在start()之后或在start()之后发送事件 - 在moduleLoad上执行都可以正常工作!
我的活动开始如下:
@Override
public final void start(final AcceptsOneWidget panel, final EventBus eventBus) {
// register events - to manipulate visibility of some display areas
eventBus.addHandler(SelectedEvent.TYPE, this);
//initiate presenters -(pseudo code)
[presenter that receives SelectedEvent]
[presenter that sends SelectedEvent]
//ading presenter's asWidgets to screen -> panel.setWidget..
...
}
@Override
public final void onSelected(final SelectedEvent event) {
//do something
}
(在开始时发送此事件的用例是,我想说没有选择任何内容 - 事件的有效负载为空)
问题是如果通过goTo调用start(),则不会调用presenter和activity的onSelected -method。但在所有情况下(使用调试器检查),在发送事件之前会发生事件注册。我该怎么办?
答案 0 :(得分:2)
Javascript不是多线程的。
当您调用goTo()方法时,您的活动将一个接一个地启动。如果在start()内部触发事件,则将在其余活动开始之前调度该事件。因此,处理该事件的活动很可能尚未开始(注册未完成)。
您可以使用以下代码解决问题:
Scheduler.get().scheduleDeferred(new ScheduledCommand()
{
@Override
public void execute()
{
//Fire the event
}
});
Scheduler是GWT提供的实用程序类。 ScheduleDeferred将在当前浏览器事件循环返回后执行该命令。
因此,通过在start()中粘贴此代码,您知道每个活动一旦启动就会触发该事件。