(Anda mungkin perlu mengubah body
ke html
atau 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 $isolateScope
pencarian 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.
$scope
memiliki 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.