(Może zajść potrzeba zmiany body
na html
lub w dowolnym miejscu 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);
})();
Dzięki Erilemowi za wskazanie tej odpowiedzi brakowało $isolateScope
wyszukiwania, a obserwatorzy potencjalnie zostali zduplikowani w swojej odpowiedzi / komentarzu.
Podziękowania dla Ben2307 za wskazanie, że 'body'
może to wymagać zmiany.
Oryginalny
Zrobiłem to samo, ale sprawdziłem atrybut danych elementu HTML, a nie jego klasę. Twój sprawdziłem tutaj:
http://fluid.ie/
I dostałem 83. Sprawdziłem swój i uzyskałem 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);
})();
Umieściłem też to w swoim:
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');
}
}
}
I nic nie zostało wydrukowane, więc domyślam się, że mój jest lepszy (w tym, że znalazł więcej zegarków) - ale brakuje mi dogłębnej wiedzy o kątach, aby wiedzieć na pewno, że mój nie jest właściwym podzbiorem zestawu rozwiązań.
$scope
ma tablicę obserwatorów $$ z liczbą obserwatorów na tym kontrolerze (cóż, jeśli masz jakieś powtórzenie ng lub coś, co tworzy inny zakres, to nie działa tak dobrze). Ale myślę, że nie ma sposobu, aby zobaczyć wszystkie zegarki w całej aplikacji.