Voir http://docs.angularjs.org/error/$rootScope:inprog
Le problème se pose lorsque vous avez un appel à $apply
qui 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 progress
erreur).
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 $apply
est exécuté de manière asynchrone. Cela peut être fait en exécutant votre code dans un appel à $timeout
avec 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 $digest
cycle, 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 $apply
lorsque 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 $timeout
plus $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.