我在尝试拨打
时遇到此错误 function MyCtrl1($scope, $location, $rootScope) {
$scope.$on('$locationChangeStart', function (event, next, current) {
event.preventDefault();
var answer = confirm("Are you sure you want to leave this page?");
if (answer) {
$location.url($location.url(next).hash());
$rootScope.$apply();
}
});
}
MyCtrl1.$inject = ['$scope', '$location', '$rootScope'];
错误是
Error: $digest already in progress
答案 0 :(得分:61)
重复:Prevent error $digest already in progress when calling $scope.$apply()
您获得的错误意味着Angular的脏检查已在进行中。
如果我们想要在下一个摘要迭代中执行任何代码,最近的最佳做法会说我们应该使用$timeout
:
$timeout(function() {
// the code you want to run in the next digest
});
之前的回复:(don't use this approach)
使用安全申请,如下所示:
$rootScope.$$phase || $rootScope.$apply();
你为什么不改变病情?
$scope.$on('$locationChangeStart', function (event, next, current) {
if (confirm("Are you sure you want to leave this page?")) {
event.preventDefault();
}
});
答案 1 :(得分:12)
对于其他希望解决此错误的人,值得注意的是docs似乎建议使用$timeout
服务来确保代码将在单个{{1}中调用阻止。
$apply
如果您查看已接受的答案,也会在this question中进行讨论。
答案 2 :(得分:2)
使用
$scope.evalAsync(function(){
});
而不是
$scope.$apply(function(){
});
答案 3 :(得分:1)
josliber的答案解决了我遇到的类似$ digest问题。我刚用过
$scope.$evalAsync(function(){
// code here
});
这里有好文章 https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm
答案 4 :(得分:0)
因为你的$ scope。$ apply()在 AngularJs环境里面。一般来说我不会建议你使用$ apply(),而且还需要$ rootScope。$ apply()函数让你的应用程序运行缓慢。它运行整个范围的新周期。