2012-04-24 22 views
0

我有一個活動,需要另一個類的服務來檢索一些數據(「DataClass」)。這個數據類可以被調用來獲取數據,並在成功時觸發一個事件。 活動第一次需要數據在「開始」 - 解析當前帶來的狀態並相應地更新視圖。活動啓動方法未命中第一個事件

問題是,onDataEvent方法的活動不是第一次調用,而是在隨後的事件中調用。我檢查了事件的處理程序。準時第一個事件被解僱,這個活動被註冊到這個事件中。我也嘗試用構造函數註冊事件,但這不會改變。 那麼如何爲一個事件註冊一個活動,並在啓動方法內觸發並對其作出反應呢?或者一般如何實現這樣的用例。

編輯 在此期間,我試圖實現它像here但沒有成功。

這裏啓動的方法的代碼:

@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事件)方法不叫第一次,但在所有後續事件。

+0

請不要「在這裏」。包括[SSCCE](http://sscce.org)。 – 2012-04-24 13:32:19

+0

如果我正確理解你的問題,你有一段代碼只需要在你的活動初始化時運行? – yair 2012-04-24 13:38:12

+0

請附上您的活動的來源。 – cardamo 2012-04-24 13:41:05

回答

0

google groups有人指出我的問題。我已經偶然發現了這種問題。問題是:如果瀏覽器處理了一些事件(活動的開始方法在地點變更事件中被調用),並且你在這個過程中註冊了另一個事件並觸發剛剛註冊的事件,它將不起作用 - 註冊不是「完成」此時。 解決方法很簡單:在觸發我的代碼「延期」事件:

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

     } 
    }); 

的問題是:這打破這一活動的測試能力(不GWT測試用例)。

from Thomas Broyer:如果調度程序注入,我可以正常測試,並有一個StubScheduler提供用於測試。在我的情況下,我創建了一個模擬調度器,只是執行命令 - 在我的情況下,只有調度最後(ScheduledCommand CMD)必須實施。