Es besteht auch die Möglichkeit, dass es sich überhaupt nicht um eine Endlosschleife handelt. 10 Iterationen sind keine ausreichend große Zahl, um mit Sicherheit darauf schließen zu können. Bevor Sie also einer Wildgansjagd nachgehen, kann es ratsam sein, diese Möglichkeit zuerst auszuschließen.
Die einfachste Methode, dies zu tun, besteht darin, die maximale Anzahl der Digest-Schleifen auf eine viel größere Zahl zu erhöhen, was module.config
mit der $rootScopeProvider.digestTtl(limit)
Methode in der Methode möglich ist. Wenn der infdig
Fehler nicht mehr auftritt, haben Sie einfach eine ausreichend komplexe Aktualisierungslogik.
Wenn Sie Daten oder Ansichten bauen auf rekursive Uhren verlassen können Sie sich für iterative Lösungen gesucht werden soll (dh nicht auf neue Digest - Schleifen unter Berufung gestartet werden) verwenden while
, for
oder Array.forEach
. Manchmal ist die Struktur nur stark verschachtelt und nicht einmal rekursiv. In diesen Fällen ist wahrscheinlich nicht viel zu tun, außer das Limit anzuheben.
Eine andere Methode zum Debuggen des Fehlers ist das Betrachten der Digest-Daten. Wenn Sie den JSON hübsch drucken, erhalten Sie ein Array von Arrays. Jeder Eintrag der obersten Ebene stellt eine Iteration dar. Jede Iteration besteht aus einer Liste von Überwachungseinträgen.
Wenn Sie beispielsweise eine Eigenschaft haben, die in a $watch
on selbst geändert wird , ist leicht zu erkennen, dass sich der Wert unendlich ändert:
$scope.vm.value1 = true;
$scope.$watch("vm.value1", function(newValue)
{
$scope.vm.value1 = !newValue;
});
[
[
{
"msg":"vm.value1",
"newVal":true,
"oldVal":false
}
],
[
{
"msg":"vm.value1",
"newVal":false,
"oldVal":true
}
],
[
{
"msg":"vm.value1",
"newVal":true,
"oldVal":false
}
],
[
{
"msg":"vm.value1",
"newVal":false,
"oldVal":true
}
],
[
{
"msg":"vm.value1",
"newVal":true,
"oldVal":false
}
]
]
Natürlich ist dies bei größeren Projekten möglicherweise nicht so einfach, zumal das msg
Feld häufig den Wert hat, "fn: regularInterceptedExpression"
wenn die Uhr eine {{ }}
Interpolation ist.
Abgesehen davon sind die bereits erwähnten Methoden, wie das Reduzieren des HTML-Codes, um die Ursache des Problems zu finden, natürlich hilfreich.