event.preventDefault()不适用于angularjs app中的routeChangeStart

时间:2013-02-15 12:45:25

标签: javascript routes angularjs angularjs-directive

希望任何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()之类的内容无法正常工作。 任何人都可以指出可能出错的地方

5 个答案:

答案 0 :(得分:32)

我很难找到这个,但是你可以听“$ 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

答案 1 :(得分:5)

正好在Angular 1.3.7之后修复 https://code.angularjs.org/1.3.7/docs/api/ngRoute/service/ $路线

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

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

答案 2 :(得分:3)

根据AngularJS docs(请参阅$ broadcast),您只需无法取消广播类型的事件($routeChangeStart属于此类型):

  

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

如果您使用$stateProvider,问题可能会持续存在。 在这种情况下使用:

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