2009-06-19 102 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) {//调用新页面}方法。

就是这样