(Bạn có thể cần thay đổi body
thành html
hoặc bất cứ nơi nào bạn đặt ng-app
)
(function () {
var root = angular.element(document.getElementsByTagName('body'));
var watchers = [];
var f = function (element) {
angular.forEach(['$scope', '$isolateScope'], function (scopeProperty) {
if (element.data() && element.data().hasOwnProperty(scopeProperty)) {
angular.forEach(element.data()[scopeProperty].$$watchers, function (watcher) {
watchers.push(watcher);
});
}
});
angular.forEach(element.children(), function (childElement) {
f(angular.element(childElement));
});
};
f(root);
// Remove duplicate watchers
var watchersWithoutDuplicates = [];
angular.forEach(watchers, function(item) {
if(watchersWithoutDuplicates.indexOf(item) < 0) {
watchersWithoutDuplicates.push(item);
}
});
console.log(watchersWithoutDuplicates.length);
})();
Cảm ơn erilem đã chỉ ra câu trả lời này đã thiếu $isolateScope
tìm kiếm và người theo dõi có khả năng bị trùng lặp trong câu trả lời / nhận xét của anh ấy / cô ấy.
Cảm ơn Ben2307 đã chỉ ra rằng 'body'
có thể cần phải thay đổi.
Nguyên
Tôi đã làm điều tương tự ngoại trừ tôi đã kiểm tra thuộc tính dữ liệu của phần tử HTML chứ không phải lớp của nó. Tôi đã chạy của bạn ở đây:
http://fluid.ie/
Và nhận được 83. Tôi đã chạy của tôi và có 121.
(function () {
var root = $(document.getElementsByTagName('body'));
var watchers = [];
var f = function (element) {
if (element.data().hasOwnProperty('$scope')) {
angular.forEach(element.data().$scope.$$watchers, function (watcher) {
watchers.push(watcher);
});
}
angular.forEach(element.children(), function (childElement) {
f($(childElement));
});
};
f(root);
console.log(watchers.length);
})();
Tôi cũng đặt cái này trong mỏ:
for (var i = 0; i < watchers.length; i++) {
for (var j = 0; j < watchers.length; j++) {
if (i !== j && watchers[i] === watchers[j]) {
console.log('here');
}
}
}
Và không có gì được in ra, vì vậy tôi đoán rằng cái của tôi tốt hơn (trong đó nó tìm thấy nhiều đồng hồ hơn) - nhưng tôi thiếu kiến thức góc cạnh thân mật để biết chắc chắn rằng cái của tôi không phải là một tập hợp con chính xác của bộ giải pháp.
$scope
có một mảng người theo dõi $$ với số lượng người theo dõi trên bộ điều khiển đó (tốt, nếu bạn có một số lần lặp lại hoặc một cái gì đó tạo ra một phạm vi khác, điều đó không hoạt động tốt). Nhưng tôi nghĩ rằng không có cách nào để xem tất cả đồng hồ trong toàn bộ ứng dụng.