Cũng có khả năng nó không phải là một vòng lặp vô hạn. 10 lần lặp không phải là một con số đủ lớn để kết luận điều đó một cách chắc chắn. Vì vậy, trước khi thực hiện một cuộc rượt đuổi ngỗng trời, có thể nên loại trừ khả năng đó trước.
Phương pháp dễ nhất để làm như vậy là tăng số vòng lặp thông báo tối đa lên một số lớn hơn nhiều, có thể được thực hiện trong module.config
phương thức, sử dụng $rootScopeProvider.digestTtl(limit)
phương thức. Nếu infdig
lỗi không còn xuất hiện, bạn chỉ cần có một số logic cập nhật đủ phức tạp.
Nếu bạn xây dựng dữ liệu hoặc quan điểm dựa vào đồng hồ đệ quy bạn có thể muốn tìm kiếm giải pháp lặp đi lặp lại (tức là không dựa vào mới tiêu hóa vòng được bắt đầu) sử dụng while
, for
hoặcArray.forEach
. Đôi khi cấu trúc chỉ được lồng ghép cao và thậm chí không có tính đệ quy, có lẽ không có nhiều việc phải làm trong những trường hợp đó ngoại trừ việc nâng cao giới hạn.
Một phương pháp gỡ lỗi khác là xem xét dữ liệu thông báo. Nếu bạn in JSON đẹp, bạn sẽ nhận được một mảng các mảng. Mỗi mục nhập cấp cao nhất đại diện cho một lần lặp, mỗi lần lặp lại bao gồm một danh sách các mục theo dõi.
Ví dụ, nếu bạn có một thuộc tính được sửa đổi trong $watch
chính nó, bạn có thể dễ dàng thấy rằng giá trị đang thay đổi vô hạn:
$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
}
]
]
Tất nhiên trong dự án lớn hơn, điều này có thể không đơn giản, đặc biệt là vì msg
trường thường có giá trị "fn: regularInterceptedExpression"
nếu đồng hồ là{{ }}
phép nội suy.
Ngoài ra, các phương pháp đã được đề cập, như cắt bớt HTML để tìm ra nguồn gốc của vấn đề, tất nhiên là hữu ích.