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.configmit der $rootScopeProvider.digestTtl(limit)Methode in der Methode möglich ist. Wenn der infdigFehler 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, foroder 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 $watchon 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 msgFeld 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.