J'obtiens cette erreur en essayant d'appeler
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'];
L'erreur est
Error: $digest already in progress
Dupliqué: Empêche l'erreur $ digest déjà en cours lors de l'appel de $ scope. $ Apply ()
Cette erreur que vous obtenez signifie que la vérification en profondeur d'Angular est déjà en cours.
Les meilleures pratiques les plus récentes disent que nous devrions utiliser $timeout
si nous voulons exécuter du code lors de la prochaine itération digest
$timeout(function() {
// the code you want to run in the next digest
});
Réponse précédente: ( n'utilisez pas cette approche )
Utilisez un coffre-fort, comme ceci:
$rootScope.$$phase || $rootScope.$apply();
Pourquoi n'inversez-vous pas la condition?
$scope.$on('$locationChangeStart', function (event, next, current) {
if (confirm("Are you sure you want to leave this page?")) {
event.preventDefault();
}
});
Pour les autres personnes cherchant à résoudre cette erreur, il convient de noter que les docs semblent suggérer l’utilisation du service $timeout
pour garantir que le code sera appelé dans un seul bloc $apply
.
$timeout(function() {
$scope.someData = someData;
});
Également discuté dans cette question si vous regardez au-delà de la réponse acceptée.
Utilisation
$scope.evalAsync(function(){
});
au lieu de
$scope.$apply(function(){
});
la réponse de josliber a résolu un problème similaire à $ digest que je rencontrais. Je viens d'utiliser
$scope.$evalAsync(function(){
// code here
});
Bon article ici https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm
Parce que votre $ scope. $ Apply () est dans l'environnement AngularJs . En général, je ne vous suggérerai pas d'utiliser $ apply (), de plus, avec les fonctions $ rootScope. $ Apply (), votre application s'exécute lentement. un nouveau cycle de toute votre portée.