Siehe http://docs.angularjs.org/error/$rootScope:inprog
Das Problem tritt auf, wenn Sie einen Aufruf haben $apply
, der manchmal asynchron außerhalb von Angular-Code ausgeführt wird (wenn $ apply verwendet werden sollte) und manchmal synchron innerhalb von Angular-Code (was das verursacht)$digest already in progress
Fehler verursacht).
Dies kann beispielsweise passieren, wenn Sie über eine Bibliothek verfügen, die Elemente asynchron von einem Server abruft und zwischenspeichert. Wenn ein Element zum ersten Mal angefordert wird, wird es asynchron abgerufen, um die Codeausführung nicht zu blockieren. Beim zweiten Mal befindet sich das Element jedoch bereits im Cache, sodass es synchron abgerufen werden kann.
Um diesen Fehler zu vermeiden, müssen Sie sicherstellen, dass der aufgerufene Code $apply
asynchron ausgeführt wird. Dies kann erreicht werden, indem Sie Ihren Code in einem Aufruf von $timeout
mit der Verzögerung 0
(die Standardeinstellung) ausführen . Durch das Aufrufen Ihres Codes im Inneren $timeout
entfällt jedoch die Notwendigkeit eines Aufrufs $apply
, da $ timeout selbst einen weiteren $digest
Zyklus auslöst , der wiederum alle erforderlichen Aktualisierungen usw. durchführt.
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...
mach das:
... your controller code...
$http.get('some/url', function(data){
$timeout(function(){
$scope.mydate = data.mydata;
});
});
... more of your controller code...
Rufen $apply
Sie nur auf, wenn Sie wissen, dass der Code, der ausgeführt wird, immer außerhalb des Angular-Codes ausgeführt wird (z. B. erfolgt Ihr Aufruf von $ apply innerhalb eines Rückrufs, der von Code außerhalb Ihres Angular-Codes aufgerufen wird).
Ich verstehe nicht, warum Sie nicht immer (ohne Verzögerung) verwenden können , es sei denn, jemand ist sich eines schwerwiegenden Nachteils bei der Verwendung von $timeout
over bewusst , da dies ungefähr das Gleiche bewirkt.$apply
$timeout
$apply