0

我有一个活动需要另一个类的服务来检索一些数据(“DataClass”)。可以调用此数据类来获取数据,并在成功时触发一个事件。该活动第一次需要数据时处于“开始”状态 - 解决当前位置带来的状态并相应地更新视图。

问题是活动 onDataEvent 方法不是第一次调用,而是在所有后续事件中调用。我检查了事件的处理程序。在第一个事件被触发时,该活动将注册到该事件中。我还尝试使用构造函数注册事件,但这没有任何改变。那么如何在 start 方法中为一个事件注册一个活动,触发并做出反应呢?或者如何普遍实现这样的用例。

同时编辑 我试图在这里实现它,但没有成功。

下面是 start 方法的代码:

    @Override
public final void start(final AcceptsOneWidget panel, final com.google.gwt.event.shared.EventBus eventBus) {
    this.eb = new ResettableEventBus(eventBus);
    if (!(pc.getWhere() instanceof DynamicTablePlace)) {
        throw new IllegalStateException(CreateDynamicTableActivity.class.getName() + " should only be called on "
                                        + DynamicTablePlace.class.getName());
    }
    view.setPresenter(this);
    this.eb.addHandler(DynamicTableHashResolvedEvent.TYPE, this);
    stateResolver.resolveState(((DynamicTablePlace) pc.getWhere()).getTablehash(), eb); //this is triggering the event
    panel.setWidget(view);
}

onDynamicTableHashResolved(DynamicTableHashResolvedEvent event) 方法不是第一次调用,而是在所有后续事件中调用。

4

1 回答 1

0

谷歌群组中,有人向我指出了这个问题。我已经偶然发现了这种问题。问题是:如果浏览器处理一些事件(活动开始方法在位置更改事件上调用)并且您在此过程中注册另一个事件并触发刚刚注册的事件它将不起作用 - 注册不是“完成”在此时。解决方案很简单:在我的代码中触发“延迟”事件:

        Scheduler.get().scheduleFinally(new ScheduledCommand() {
        @Override
        public void execute() {
            stateResolver.resolveState(((DynamicTablePlace) pc.getWhere()).getTablehash(), eb);

        }
    });

问题是:这破坏了该活动的测试能力(没有 gwt 测试用例)。

来自Thomas Broyer:如果调度程序被注入,我可以正常测试,并且提供了一个 StubScheduler 用于测试。在我的例子中,我为调度程序创建了一个模拟,它只执行命令 - 在我的例子中,只有 scheduleFinally(ScheduledCommand cmd) 必须实现。

于 2012-04-25T07:07:12.967 回答