I'm getting this error while trying to call
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 is
Error: $digest already in progress
Duplicated: Prevent error $digest already in progress when calling $scope.$apply()
That error you are getting means Angular's dirty checking is already in progress.
Most recent best practices say that we should use $timeout
if we want to execute any code in the next digest iteration:
$timeout(function() {
// the code you want to run in the next digest
});
Previous response: ( don't use this approach )
Use a safe apply, like this:
$rootScope.$$phase || $rootScope.$apply();
Why don't you invert the condition?
$scope.$on('$locationChangeStart', function (event, next, current) {
if (confirm("Are you sure you want to leave this page?")) {
event.preventDefault();
}
});
For others looking to troubleshoot this error, it's worth noting that the docs seem to suggest using the $timeout
service to ensure the code will be called in a single $apply
block.
$timeout(function() {
$scope.someData = someData;
});
Also discussed in this question if you look past the accepted answer.
Use
$scope.evalAsync(function(){
});
instead of
$scope.$apply(function(){
});
josliber's answer solved a similar $digest problem that I was having. I just used
$scope.$evalAsync(function(){
// code here
});
Good article here https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm
因为$ scope。$ apply()在AngularJs环境中 。一般情况下我不会建议你使用$ apply(),而且$ rootScope。$ apply()函数会使你的应用程序运行缓慢。它会运行一个新的循环你的整个范围。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.