Также существует вероятность того, что это вообще не бесконечный цикл. 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 для поиска источника проблемы, конечно же, полезны.