Також існує ймовірність, що це взагалі не буде нескінченною петлею. 10 ітерацій - це недостатньо велика кількість, щоб зробити висновок, що з будь-якою кількістю достовірності. Тому перед тим, як переслідувати диких гусей, може бути доцільним спочатку виключити таку можливість.
Найпростіший спосіб зробити це - збільшити максимальну кількість циклів дайджесту до набагато більшої кількості, що можна зробити в module.configметоді, використовуючи $rootScopeProvider.digestTtl(limit)метод. Якщо infdigпомилка більше не відображається, ви просто маєте досить складну логіку оновлення.
Якщо ви створюєте дані або подання, спираючись на рекурсивні годинники, можливо, вам доведеться шукати ітеративні рішення (тобто не покладатися на нові цикли дайджесту, які потрібно запустити), використовуючи while, forабо Array.forEach. Іноді структура просто дуже вкладена і навіть не рекурсивна, у цих випадках, мабуть, не потрібно багато робити, крім підвищення межі.
Інший метод налагодження помилки - перегляд дайджест-даних. Якщо ви досить друкуєте JSON, ви отримуєте масив масивів. Кожен запис верхнього рівня являє собою ітерацію, кожна ітерація складається зі списку записів перегляду.
Якщо у вас, наприклад, є властивість, яка модифікується $watchсама по собі, неважко помітити, що значення змінюється нескінченно:
$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
}
]
]
Звичайно, у великому проекті це може бути не так просто, тим більше, що msgполе часто має значення, "fn: regularInterceptedExpression"якщо годинник є {{ }}інтерполяцією.
Окрім цього, звичайно, корисними є вже згадані методи, такі як скорочення HTML для пошуку джерела проблеми.