2012-07-10 81 views
2

我在我的GWT應用程序中有一個Previous按鈕,我附加了一個事件處理程序,它調用了History.back()GWT History.back()沒有觸發onValueChangeHandler

eventBus.addHandler(PrevEvent.TYPE, new PrevEventHandler() { 
     public void onNext(PrevEvent prevEvent) { 
      History.back(); 
      System.out.println("Token is" +History.getToken()); 

     } 
    }); 

當事件被觸發,我可以看到URL標記在瀏覽器中被改變,但History.getToken()是印刷近期令牌本身。 對於例如,如果爲了#A加入令牌,#B,#C,當我點擊以前當我在#C網址更改爲#B,但爲gettoken表示,其#C。 我認爲這是導致沒有呼叫onValueChange方法的問題,因此我的應用程序保持不變。

當我嘗試使用瀏覽器的後退按鈕時觀察到同樣的情況。我使用的是Firefox,但在其他瀏覽器中的行爲沒有什麼不同。

可能是什麼原因?

我的看法是,History.back()也會觸發onValueChange(),現在似乎只有History.newItem()會做能夠做的工作,然後。糾正我,如果我錯了。我很困惑。我如何處理以前的按鈕事件呢?

 eventBus.addHandler(PrevEvent.TYPE, new PrevEventHandler() { 
     public void onNext(PrevEvent prevEvent) { 
      History.back(); 
      System.out.println("Token is" +History.getToken()); 
      doPrev(); 
     } 
    }); 


    private void doPrev(){ 
     System.out.println("Calling Previous Method"); 
} 

在我的應用程序的某處,我的代碼與當前歷史令牌#Step3激發了以前的事件。因此,當涉及到以前的事件,我執行History.back(),我希望令牌是回到#第二步和我有onValueChange方法就是這樣,

public void onValueChange(ValueChangeEvent<String> event) { 

    String token = event.getValue(); 

    if(token != null){ 
     presenter = null; 

    if(token == "step1") 
    { 
     System.out.println("Step 1"); 
     //do Something 

    } 
    else if(token == "step2") 
    { 
     System.out.println("Step 2"); 
        //do Something  
    } 
      else if(token == "step3") 
    { 
     System.out.println("Step 3"); 
        //do Something  
    } 

回答

3

它看起來像History.back ()將地久天長的時間(從字面上龍,約立體交叉公路100米利斯:))

我寫了一些代碼來測試它:

public void onModuleLoad() 
{ 
    History.newItem("A"); 
    History.newItem("B"); 
    History.newItem("C"); 
    RootPanel.get().add(new Button("back", new ClickHandler() 
    { 

     @Override 
     public void onClick(
      ClickEvent event) 
     { 
      System.out.println("After back click token is " + History.getToken()); 
      History.back(); 
      new Timer() 
      { 

       @Override 
       public void run() 
       { 
        System.out.println("After 100 millis token is " + History.getToken()); 
       } 
      }.schedule(100); 
     } 
    })); 
    History.addValueChangeHandler(new ValueChangeHandler<String>() 
    { 

     @Override 
     public void onValueChange(
      ValueChangeEvent<String> event) 
     { 
      System.out.println("We handle ValueChangeEvent on History. Now token is " + History.getToken()); 
     } 
    }); 
} 

輸出在谷歌瀏覽器是如下

After back click token is C 
After 100 millis token is C 
We handle ValueChangeEvent on History. Now token is B 
After back click token is B 
We handle ValueChangeEvent on History. Now token is A 
After 100 millis token is A 
After back click token is A 
We handle ValueChangeEvent on History. Now token is C 
After 100 millis token is C 

這是沒有答案你想要的,但它是太大評論:)

+0

感謝您的答覆。儘管我嘗試瞭解決方案時遇到了問題,但是如果History.back()需要太多時間來執行,並且在執行之後執行後續步驟,那麼您認爲對於此問題可行的解決方案是什麼? – Napster 2012-07-10 10:50:24

+0

你的問題到底是什麼?歷史不會觸發valueChangeEvent? – cardamo 2012-07-11 03:09:01

+0

準確地說,History.back()不會觸發valueChangeEvent! – Napster 2012-07-11 04:22:40