17

常规 JavaScript 有 window.onbeforeunload。如何使用 HTML5 路由在 AngularJS 中模拟相同的内容?

有 $beforeRouteChange,但据我所知,它不允许您取消活动。

澄清一下:window.onbeforeunload 适用于离开页面导航,但不适用于页面内导航,例如仅通过 HTML5 历史 API 从一个控制器到另一个控制器。

4

4 回答 4

21

添加这个:

$scope.$on('$destroy', function() {
   window.onbeforeunload = undefined;
});
$scope.$on('$locationChangeStart', function(event, next, current) {
   if(!confirm("Are you sure you want to leave this page?")) {
      event.preventDefault();
   }
});
于 2014-05-06T12:21:18.000 回答
16

有一个$locationChangeStart可以取消的事件。

由于尚未记录,这里是描述它如何影响$route服务的单元测试。 https://github.com/angular/angular.js/blob/v1.0.1/test/ng/routeSpec.js#L63

这不会像window.onbeforeunload那样为用户提供确认。您需要带上自己的对话服务并重新启动位置更改过程以获得相同的效果(或者您可以只使用同步$window.confirm)。

于 2012-08-27T16:59:56.210 回答
5

如果您使用的是 angular-ui-router,则需要使用$stateChangeStart而不是$locationChangeStart.

于 2015-03-26T10:06:47.960 回答
0

使用UI-Router 版本 1.0.0+时,请使用$transitions.onStart. $stateChangeStart请参阅转换挂钩文档。

$stateChange*从版本 1.0.0 ( source ) 开始不推荐使用这些事件:

所有状态事件(即$stateChange*和朋友)现在默认已弃用和禁用。使用 Transition Hook API,而不是监听事件。

中止转换的示例代码(source):

$transitions.onStart({}, function(transition) {
  if (transition.to().name === 'unreachable') {
    return false;
  }
}
于 2018-03-10T16:36:47.597 回答