代码之家  ›  专栏  ›  技术社区  ›  Philippe Beaudoin

在GWT中,当用户在导航确认对话框中点击“取消”时,如何重置URL?

  •  4
  • Philippe Beaudoin  · 技术社区  · 16 年前

    在我的GWT应用程序中,当用户导航出当前应用程序时,我想请求用户确认, 通过输入URL或关闭浏览器。这通常是通过注册 ClosingHandler 并在 onWindowClosing 方法。这似乎很管用。

    但是,如果用户试图导航,请说 http://www.gmail.com (通过在URL栏中输入)并点击 取消 为了表明他不想导航,我的应用程序会继续运行,但浏览器的URL栏会一直显示 网址:http://www.gmail.com . 这会在稍后的应用程序中引起一些问题,如果用户将页面标记为书签,则会给出错误的结果。

    当用户按 取消 ?

    或者,是否有方法检测用户按下 取消 按钮?如果是这样,是否有方法在不触发 ValueChangeEvent ?(我可以添加一些逻辑来防止这种情况发生,但如果存在内置机制,我宁愿使用它。)

    3 回复  |  直到 9 年前
        1
  •  3
  •   Hilbrand Bouwkamp    16 年前

    不确定这是否有效,但您是否尝试过: History.newItem(History.getToken(), false); 重置URL?它在不触发新历史记录项的情况下设置历史记录标记。

        2
  •  1
  •   Philippe Beaudoin    16 年前

    我设法做到了。似乎GWT DeferredCommand是在确认窗口关闭后执行的。这个,再加上希尔布兰德的回答,给了我确切的我想要的。我就是这样做的:

      public final void onWindowClosing(Window.ClosingEvent event) {
        event.setMessage(onLeaveQuestion);
        DeferredCommand.addCommand( new Command() {
          public void execute() {
            Window.Location.replace(currentLocation);
          }
        });
      }
    

    在哪里? currentLocation 通过调用获取 Window.Location.getHref() 每次历史标记更改时。

        3
  •  0
  •   Björn    9 年前

    我通过创建一个自定义的PlaceController并替换URL中的令牌来解决这个问题。不是一个理想的解决方案,但它是有效的!

    if (warning == null || Window.confirm(warning)) { where = newPlace; eventBus.fireEvent(new PlaceChangeEvent(newPlace)); currentToken = History.getToken(); } else { // update the url when user clicks cancel in confirm popup. History.replaceItem(currentToken, false); }