(Anda mungkin perlu mengubah bodyke htmlatau ke mana pun Anda meletakkannya 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);
})();
Berkat erilem karena menunjukkan jawaban ini tidak ada $isolateScopepencarian dan pengamat berpotensi diduplikasi dalam jawaban / komentarnya.
Terima kasih kepada Ben2307 untuk menunjukkan bahwa 'body'mungkin perlu diubah.
Asli
Saya melakukan hal yang sama kecuali saya memeriksa atribut data elemen HTML daripada kelasnya. Saya menjalankan milik Anda di sini:
http://fluid.ie/
Dan mendapatkan 83. Saya menjalankan milik saya dan mendapatkan 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);
})();
Saya juga menaruh ini di tambang:
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');
}
}
}
Dan tidak ada yang dicetak, jadi saya menduga milik saya lebih baik (karena menemukan lebih banyak arloji) - tetapi saya tidak memiliki pengetahuan sudut yang intim untuk mengetahui dengan pasti bahwa tambang bukan bagian yang tepat dari rangkaian solusi.
$scopememiliki array pengamat $$ dengan jumlah pengamat pada pengontrol itu (baik, jika Anda memiliki beberapa ng-repeat atau sesuatu yang menciptakan ruang lingkup lain, itu tidak berfungsi dengan baik). Tapi saya pikir tidak ada cara untuk melihat semua jam tangan di seluruh aplikasi.