Javascript event.preventDefault()不适用于angularjs应用程序中的routeChangeStart

Javascript event.preventDefault()不适用于angularjs应用程序中的routeChangeStart,javascript,routes,angularjs,angularjs-directive,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.prev

希望任何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()
不起作用。
任何人能否指出可能的错误

根据AngularJS(见$broadcast),您只需无法取消广播类型的事件(属于该类型):

事件生命周期从创建$broadcast的作用域开始 打电话。在此作用域上侦听name事件的所有侦听器都将获取 通知。之后,事件会传播到所有直接和间接事件 并调用所有已注册的侦听器 顺便说一下。无法取消该事件


我在查找此事件时遇到了很多困难,但是您可以收听“$locationChangeStart”事件,而不是“$routeChangeStart”事件,您可以防止默认:

$scope.$on("$locationChangeStart", function(event, next, current) {
    if (!confirm("You have unsaved changes, continue navigating to " + next + " ?")) {
        event.preventDefault();
    }
});
您还可以始终阻止默认设置,存储“next”,并显示一个干净的JS模式并异步决定


$locationChangeStart当前未记录,但此处引用:

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


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

在angular 1.3.7之后完全修复 $route

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


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

如果您使用的是
$stateProvider
,则问题可能仍然存在。 在这种情况下,请使用:

$scope.$on(“$stateChangeStart”,函数(事件){
.....
event.preventDefault();

});确定除使用$routeChangeStart外,dere是否还有其他方法检测浏览器后退按钮单击。我已经尝试过locationChangeStart和onbeforeunload,两者都不起作用。我会先调用一个函数检查所有依赖项,只有当它们为真时,才更改位置。更多关于您实际尝试执行的操作的详细信息会更好。事实上,我有一个表单。如果表单中有未保存的数据,并且用户单击浏览器后退按钮,它会请求确认消息。这就是我实际尝试执行的操作。如果您可以发布一些代码,这将非常有帮助。正如我所说,在发布时不要直接更改位置单击“提交”按钮只需调用一个函数并评估表单。您现在要求的更像是如何计算表单,而不是为什么preventDefault()不起作用,或者我有什么问题吗?可能是检查:@Flek,但该解决方案不会提示用户进行确认,而只是不允许browse back按钮起作用。我遇到了相同的问题。我尝试了$routeChangeStart和$locationChangeStart,但都没有成功。你找到这个问题的合适解决方案了吗?@Sam plz检查这个不准确的解决方案,但可能会有帮助。由于某些原因,这对我不起作用,我复制并粘贴了与你提供的代码块完全相同的代码块,但当我单击“取消”时,它仍然会将我带到下一页。你知道为什么我的preventDefault()不起作用吗?