Ich erhalte diese Fehlermeldung, während ich anrufe
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'];
Fehler ist
Error: $digest already in progress
Duplicated: Verhindert, dass beim Aufruf von $ scope der Fehler $ digest bereits ausgeführt wird. $ Apply ()
Dieser Fehler bedeutet, dass Angulars Dirty-Check bereits läuft.
Die neuesten Best Practices sagen, dass wir $timeout
verwenden sollten, wenn wir Code in der nächsten Digest Iteration ausführen möchten:
$timeout(function() {
// the code you want to run in the next digest
});
Vorherige Antwort: ( verwende diesen Ansatz nicht )
Verwenden Sie eine sichere Anwendung wie diese:
$rootScope.$$phase || $rootScope.$apply();
Warum kehrst du den Zustand nicht um?
$scope.$on('$locationChangeStart', function (event, next, current) {
if (confirm("Are you sure you want to leave this page?")) {
event.preventDefault();
}
});
Für andere, die diesen Fehler beheben möchten, ist zu beachten, dass der Befehl docs die Verwendung des $timeout
-Dienstes vorschlägt, um sicherzustellen, dass der Code in einem einzigen $apply
-Block aufgerufen wird.
$timeout(function() {
$scope.someData = someData;
});
Auch in diese Frage wenn Sie über die akzeptierte Antwort schauen.
Benutzen
$scope.evalAsync(function(){
});
anstatt
$scope.$apply(function(){
});
joslibers Antwort löste ein ähnliches $ Digest-Problem, das ich hatte. Ich habe gerade gebraucht
$scope.$evalAsync(function(){
// code here
});
Guter Artikel hier https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm
Da $ scope. $ Apply () in der Umgebung AngularJs liegt. Im Allgemeinen wird nicht empfohlen, $ apply () zu verwenden. Außerdem wird die Anwendung von $ rootScope. $ Apply () -Funktionen dazu führen, dass die Anwendung langsam ausgeführt wird ein neuer Zyklus Ihres gesamten Umfangs.