【问题标题】:GWT - Trouble with History first tokenGWT - 历史第一个令牌的问题
【发布时间】:2010-11-26 17:07:34
【问题描述】:

我有这个问题:当我调用 Content 类(决定查看哪个页面的那个,由于#param)时,我会做这样的事情:

History.addValueChangeHandler(this);
if(!History.getToken().isEmpty()){
    changePage(History.getToken());
} else {
    History.newItem("homepage");
}

所以,现在,如果我查看浏览器的导航栏,我会看到http://localhost:8084/GWT/?gwt.codesvr=127.0.0.1:9997#homepage。没错。不幸的是,如果我在浏览器上按Back,我会看到它加载了以前的地址,例如http://localhost:8084/GWT/?gwt.codesvr=127.0.0.1:9997

我在开头有一种“假”页面。

1 - 我该如何解决?并使用默认令牌启动应用程序,或将其从历史记录中删除。或者在有空token时调用onValueChange方法,然后用某种switch/if-else决定工作流程。

2 - 作为相关问题,当我在 costructor 类中调用 History.addValueChangeHandler(this); 时,netbeans 说“在构造函数中泄漏这个”。什么意思?

干杯

【问题讨论】:

    标签: gwt history gwt-history


    【解决方案1】:

    也许您忘记在onModuleLoad() 方法的末尾添加History.fireCurrentHistoryState();

    【讨论】:

    • 事实上,我没有直接在 onModuleLoad() 上调用 History,而是在另一个 Class 上,在 onModuleLoad 启动时“添加”。这是个问题吗?是的,我从不调用那个方法......
    【解决方案2】:

    您需要设置一个历史令牌并使用当前令牌触发历史更改事件。 以下是你如何做到的:

    / If the application starts with no history token, redirect to a new
    // 'homepage' state.
    String initToken = History.getToken();
    if (initToken.length() == 0) {
      History.newItem("homepage");
    }
    
    // Add widgets etc
    
    
    // Add history listener
    History.addHistoryListener(yourHistoryHandler);
    
    // Fire the initial history state.
    History.fireCurrentHistoryState();
    

    【讨论】:

    • 什么需要调用fireCurrenthistoryState()??是否仅在第一次调用后才需要,如果您调用 History.newItem("test") 从任何其他类,它将起作用。无需再次调用 fireCurrenthistoryState() 为什么 ??
    • 考虑用户直接尝试在您的 Web 应用程序中打开 URL 的情况,例如 -your-app/#settings。在这种情况下,历史令牌的初始值将是#settings。不用说,当您稍后在代码中附加一个 HistoryListener 时,它不会捕获初始历史令牌,因为从未触发历史更改。因此,最好触发应用程序的当前历史状态,以确保您的历史更改侦听器已收到它。
    • 嘿,刚刚得到它......如果你的历史处理程序没有首先加载,那么..你需要精细当前历史记录令牌......一旦历史处理程序加载然后需要触发当前历史记录toekn
    【解决方案3】:

    恕我直言,“proto://hostname#homepage”形式的主页网址很丑:)

    1.只是一个建议:

    String token = History.getToken();
    String page = token.isEmpty() ? "homepage" : token;
    changePage(page);
    

    2. 你的入口点是否实现ValueChangeHandler<String>

    【讨论】:

    • 感谢您的回答。嗯,不是真的。 I 实现我的内容(流面板)可以更改的界面。是不是错了?
    • 还有一件事,您应该考虑:如果没有特殊的 iframe,internet explorer 无法正确处理历史状态,应该将其合并到您的 index.html 部分。它应该看起来像 ......
    • 其次,您应该将 [1] 包装到方法中并在页面加载时调用它(正如其他人已经指出的那样)
    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多