2009-06-19 100 views
0

我有一個更大的應用程序,我正在使用,但GWT History documentation有一個簡單的例子來演示這個問題。該示例複製爲方便:如何重建GWT歷史堆棧?

public class HistoryTest implements EntryPoint, ValueChangeHandler 
{ 
    private Label lbl = new Label(); 

    public void onModuleLoad() 
    { 
     Hyperlink link0 = new Hyperlink("link to foo", "foo"); 
     Hyperlink link1 = new Hyperlink("link to bar", "bar"); 
     Hyperlink link2 = new Hyperlink("link to baz", "baz"); 

     String initToken = History.getToken(); 

     if (initToken.length() == 0) 
     { 
      History.newItem("baz"); 
     } 

     // Add widgets to the root panel. 
     VerticalPanel panel = new VerticalPanel(); 
     panel.add(lbl); 
     panel.add(link0); 
     panel.add(link1); 
     panel.add(link2); 
     RootPanel.get().add(panel); 

     History.addValueChangeHandler(this);  // Add history listener 
     History.fireCurrentHistoryState(); 
    } 

    @Override 
    public void onValueChange(ValueChangeEvent event) 
    { 
     lbl.setText("The current history token is: " + event.getValue()); 
    } 
} 

問題是,如果刷新應用程序,歷史堆棧會被吹走。如何保留歷史記錄,以便用戶刷新頁面時,後退按鈕仍然有用?

回答

2

我剛纔與Firefox和Chrome測試,它爲我的應用程序和頁面刷新不清除歷史記錄。你使用哪個瀏覽器?你有你的HTML中的

<iframe src="javascript:''" id='__gwt_historyFrame' style='position:absolute;width:0;height:0;border:0'></iframe> 

嗎?

+0

是,歷史框架已經到位。事實證明,這不是我控制下的技術問題,現在我感到很尷尬。 有些事情在發揮作用。首先,GWT瀏覽器在刷新時丟失歷史記錄(有時我忘記編譯)。其次,IE對於歷史表現奇怪。第三,一些開發者沒有把歷史令牌推向堆棧。 感謝您看看這個對我來說,抱歉的麻煩。 – Michael 2009-06-22 12:05:41

1

通過提供History對象,GWT已經迎合了這個問題。通過調用靜態方法History.newItem("your token"),您將能夠將令牌傳遞到查詢字符串中。

但是,您需要注意的是,任何時候在gwt應用程序中發生歷史更改時,都會觸發onValueChange(ValueChangeEvent event){}事件,並且可以在該方法中調用相應的頁面。以下是我用來解決這個問題的一系列步驟。

  1. 將點擊偵聽器添加到需要調用新頁面的對象。在處理事件時,將令牌添加到history.(History.newItem("new_token")。在實現EntryPoint的類中實現ValueChangeHandler

  2. onValueChangeHandler(this)添加到實現EntryPoint的類的偵聽器。確保該行添加了實現EntryPoint的類的onModuleLoad()方法(很重要的是它添加了此方法)(非常明顯的哈!)

  3. 最後實現onValueChange(ValueChangeEvent event) {//調用新頁面}方法。

就是這樣