15

希望任何 angularjs 大师都可以帮助我。这是我的 angularjs 代码

$scope.$on('$routeChangeStart', function(event, next, current) {
                if ($scope.myForm.$dirty) {
                    if(!confirm("Unsaved, do u want to continue?")) {
                        event.preventDefault();
                    }
                }
            });

当数据脏时,它会在浏览器后退按钮单击中发出警报,但在单击取消或确定时,它仍会完成路线更改。似乎event.preventDefault()无法正常工作。任何人都可以指出什么可能是错的

4

5 回答 5

33

我在找到这个时遇到了很多麻烦,但是您可以收听“$locationChangeStart”事件,而不是“$routeChangeStart”事件,您可以阻止默认事件:

$scope.$on("$locationChangeStart", function(event, next, current) {
    if (!confirm("You have unsaved changes, continue navigating to " + next + " ?")) {
        event.preventDefault();
    }
});

您也可以始终阻止默认,存储“下一个”,并显示一个干净的 JS 模式并异步决定。

$locationChangeStart 目前没有记录,但在这里引用:https ://github.com/angular/angular.js/issues/2109

于 2013-03-19T14:50:23.460 回答
5

在 Angular 1.3.7 https://code.angularjs.org/1.3.7/docs/api/ngRoute/service/ $route之后完全修复

$routeChangeStart 在路由更改之前广播。此时,路由服务开始解决发生路由更改所需的所有依赖项。通常这涉及获取视图模板以及在解析路由属性中定义的任何依赖项。一旦解决了所有依赖项,就会触发 $routeChangeSuccess。

可以通过调用事件的 preventDefault 方法来防止路由更改(以及触发它的 $location 更改)。有关事件对象的更多详细信息,请参阅 $rootScope.Scope。

于 2015-02-05T18:01:22.750 回答
3

根据 AngularJS文档(参见 $broadcast),您根本无法取消广播类型的事件($routeChangeStart属于该类型):

事件生命周期从调用 $broadcast 的范围开始。在此范围内侦听名称事件的所有侦听器都会收到通知。之后,该事件传播到当前作用域的所有直接和间接作用域,并沿途调用所有已注册的侦听器。活动无法取消。

于 2013-02-15T13:25:52.247 回答
2

此问题已在最新版本 ( >= 1.3.8 ) 中修复。

由于提供给 $routeChangeStart 的参数更详细(并且通常更有用),如果可能,请尝试更新您的角度版本...

于 2015-01-16T18:21:32.290 回答
0

如果您使用的是$stateProvider. 在这种情况下使用:

$scope.$on('$stateChangeStart', function( event){
  .....
  event.preventDefault();
});

于 2018-02-05T10:12:22.417 回答