【问题标题】:OJET - How do I alert a user before leaving my page?OJET - 我如何在离开我的页面之前提醒用户?
【发布时间】:2020-10-22 01:34:40
【问题描述】:

我正在使用 Oracle JET 开发单页应用程序。在我正在构建的页面中,我试图在用户尝试离开页面而不保存更改时提醒他们。 所以在离开页面时我想:

  • 拦截路由。
  • 检查是否有任何变化。
  • 如有更改,请弹出一个窗口。
  • 如果没有任何未保存的更改,则继续路由。

我相信使用 ojRouter (doc link here) 应该可以做到这一点,但我还没有让它工作。我已经尝试了很多方法,但这是我目前为止得到的结果:

编辑:我已经更进一步并成功地访问了 canExit 属性,我在下面编辑了我的代码块。但是,这仍然不会阻塞路由。

oj.Router.sync().then(() => {
   const letrouterState = oj.Router.rootInstance;
   letrouterState.currentState().canExit = ableToExit();
});

function ableToExit() {
  let canExit;
  //function that will check if the page has unsaved changes
  if (ableToExit()) {
    canExit = false;
  } else {
    canExit = true;
  }
  return canExit;
}

我也尝试过使用window.onhashchange。但是,这只会在我的页面打开页面时触发事件,而不是在离开时触发。

我希望我能明确我的问题,如果需要,我很乐意澄清我的任何要求。有人可以帮助我吗?提前感谢您的宝贵时间。

-沃特

【问题讨论】:

  • 嗨,德米特里,谢谢您的回复。我已经看到并尝试了该问题的解决方案。不幸的是,这对我不起作用,因为我使用的是单页应用程序。当我实现该代码时,它不会触发任何事件。
  • 哦,我明白了.. 对不起,我不熟悉 oracle jet。
  • docs.oracle.com/cd/E86256_01/jet/reference-jet/… RouterState 类的选项参数中似乎有一个回调方法可用。如果您使用 canExit 选项设置它,您可以尝试获取当前路由器状态,查看它是否与您需要“阻止”的路由匹配。如果确实如此,则运行一些逻辑来确定用户是否可以继续,执行您的警报,返回 false。如果他们已填写,您只需为该方法返回 true。默认情况下,您希望它返回 true,这样它就不会与其他路由混淆。
  • 您好 BudHead,非常感谢您的回复。这确实是我尝试过的事情之一,但它变得非常混乱。因此,我们决定调整要求,不再使用它。

标签: javascript jquery knockout.js routes oracle-jet


【解决方案1】:

ModuleViewModel 接口实现了可选的canExit 方法,该方法在ModuleRouterAdapterbeforeStateChange 事件上被调用。假设您将ModuleRouterAdapter<oj-module> 结合使用,这相对容易实现,您只需返回一个Promise,然后解决或拒绝它。

【讨论】:

    【解决方案2】:

    因为干预整个路由器成为一个非常混乱的解决方案,我们决定调整要求,不再这样做。感谢任何试图提供帮助的人。故事的寓意是不要尝试这个:)。

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      相关资源
      最近更新 更多