Istnieje również możliwość, że w ogóle nie będzie to nieskończona pętla. 10 iteracji nie jest wystarczająco dużą liczbą, aby stwierdzić to z jakąkolwiek pewnością. Dlatego przed wyruszeniem w pogoń za dziką gęsią warto najpierw wykluczyć tę możliwość.
Najłatwiejszą metodą jest zwiększenie maksymalnej liczby pętli skrótu do znacznie większej liczby, co można zrobić w module.config
metodzie, używając $rootScopeProvider.digestTtl(limit)
metody. Jeśli infdig
błąd już się nie pojawia, masz po prostu wystarczająco złożoną logikę aktualizacji.
Jeśli budować danych lub widoków zależnych od rekurencyjnych zegarków może chcesz szukać rozwiązań iteracyjnych (czyli nie opierając się na nowych strawić pętli zostać uruchomiona) używając while
, for
lub Array.forEach
. Czasami struktura jest po prostu silnie zagnieżdżona, a nawet nie rekursywna, prawdopodobnie w takich przypadkach nie ma wiele do zrobienia poza podniesieniem limitu.
Inną metodą debugowania błędu jest sprawdzenie danych skrótu. Jeśli dobrze wydrukujesz JSON, otrzymasz tablicę tablic. Każdy wpis najwyższego poziomu reprezentuje iterację, każda iteracja składa się z listy obserwowanych wpisów.
Jeśli na przykład masz właściwość, która została zmodyfikowana w $watch
samym sobie, łatwo zauważyć, że wartość zmienia się w nieskończoność:
$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
}
]
]
Oczywiście w większych projektach może to nie być takie proste, zwłaszcza że msg
pole często ma wartość, "fn: regularInterceptedExpression"
jeśli zegarek jest {{ }}
interpolowany.
Poza tym wspomniane już metody, takie jak wycinanie kodu HTML w celu znalezienia źródła problemu, są oczywiście pomocne.