Voir http://docs.angularjs.org/error/$rootScope:inprog
Das Problem tritt auf, wenn Sie einen Aufruf an $apply
die manchmal asynchron außerhalb von Angular-Code ausgeführt wird (wenn $apply verwendet werden sollte) und manchmal synchron innerhalb von Angular-Code (was dazu führt, dass die $digest already in progress
Fehler).
Dies kann z. B. passieren, wenn Sie eine Bibliothek haben, die asynchron Elemente von einem Server abruft und in den Cache stellt. Beim ersten Mal, wenn ein Element angefordert wird, wird es asynchron abgerufen, um die Codeausführung nicht zu blockieren. Beim zweiten Mal jedoch befindet sich das Element bereits im Cache, so dass es synchron abgerufen werden kann.
Um diesen Fehler zu vermeiden, muss sichergestellt werden, dass der Code, der die $apply
wird asynchron ausgeführt. Dies kann erreicht werden, indem Sie Ihren Code innerhalb eines Aufrufs von $timeout
mit einer Verzögerung von 0
(dies ist die Standardeinstellung). Wenn Sie jedoch Ihren Code innerhalb von $timeout
entfällt die Notwendigkeit des Aufrufs $apply
denn $timeout löst eine weitere $digest
Zyklus, der seinerseits alle notwendigen Aktualisierungen vornimmt usw.
Lösung
Kurz gesagt, anstatt dies zu tun:
... your controller code...
$http.get('some/url', function(data){
$scope.$apply(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
dies tun:
... your controller code...
$http.get('some/url', function(data){
$timeout(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
Nur anrufen $apply
wenn Sie wissen, dass der Code, der ihn ausführt, immer außerhalb des Angular-Codes ausgeführt wird (z.B. wird Ihr Aufruf von $apply innerhalb eines Callbacks erfolgen, der von Code außerhalb Ihres Angular-Codes aufgerufen wird).
Es sei denn, jemand ist sich eines erheblichen Nachteils bei der Verwendung von $timeout
über $apply
Ich wüsste nicht, warum man nicht immer die Option $timeout
(mit Nullverzögerung) anstelle von $apply
da es in etwa das Gleiche bewirkt.