AngularJS中window.onbeforeunload对等路由的等价性

Mar*_*bst 17 angularjs

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

有$ beforeRouteChange,但它不允许你取消事件,据我所知.

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

Epo*_*okK 22

添加这个:

$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();
   }
});
Run Code Online (Sandbox Code Playgroud)

  • 对于angular-ui-router,$ stateChangeStart`应该使用.并且它不处理页面刷新,因为它是在`window.onbeforeunload`的情况下处理的 (6认同)

小智 16

有一个$locationChangeStart事件可以取消.

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

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


小智 5

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