Voir http://docs.angularjs.org/error/$rootScope:inprog
Le problème se pose lorsque vous avez un appel à $applyqui est parfois exécuté de manière asynchrone en dehors du code angulaire (lorsque $ apply doit être utilisé) et parfois de manière synchrone dans le code angulaire (ce qui provoque l' $digest already in progresserreur).
Cela peut se produire, par exemple, lorsque vous disposez d'une bibliothèque qui récupère de manière asynchrone des éléments d'un serveur et les met en cache. La première fois qu'un élément est demandé, il sera récupéré de manière asynchrone afin de ne pas bloquer l'exécution du code. La deuxième fois, cependant, l'élément est déjà dans le cache afin qu'il puisse être récupéré de manière synchrone.
Pour éviter cette erreur, vous devez vous assurer que le code qui appelle $applyest exécuté de manière asynchrone. Cela peut être fait en exécutant votre code dans un appel à $timeoutavec le délai défini sur 0(qui est la valeur par défaut). Cependant, appeler votre code à l'intérieur $timeoutélimine la nécessité d'appeler $apply, car $ timeout déclenchera lui-même un autre $digestcycle, qui, à son tour, fera toutes les mises à jour nécessaires, etc.
Solution
Bref, au lieu de faire ça:
... your controller code...
$http.get('some/url', function(data){
$scope.$apply(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
faites ceci:
... your controller code...
$http.get('some/url', function(data){
$timeout(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
Appelez uniquement $applylorsque vous connaissez le code en cours d'exécution, il sera toujours exécuté en dehors du code angulaire (par exemple, votre appel à $ apply se fera à l'intérieur d'un rappel appelé par du code en dehors de votre code angulaire).
À moins que quelqu'un ne soit conscient de certains inconvénients importants à utiliser $timeoutplus $apply, je ne vois pas pourquoi vous ne pourriez pas toujours utiliser $timeout(avec zéro retard) au lieu de $apply, car cela fera à peu près la même chose.