(Вы , возможно , потребуется изменение body
в html
или везде , где вы кладете 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);
})();
Спасибо Эрилем за указание на то, что в этом ответе пропущен $isolateScope
поиск, и наблюдатели потенциально дублируются в его / ее ответе / комментарии.
Спасибо Ben2307 за указание на то, что, 'body'
возможно, потребуется изменить.
оригинал
Я сделал то же самое, за исключением того, что проверил атрибут данных элемента HTML, а не его класс. Я управлял твоим здесь:
http://fluid.ie/
И получил 83. Я побежал мой и получил 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);
})();
Я также положил это в свой:
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');
}
}
}
И ничего не распечатано, так что я предполагаю, что мои лучше (в том, что они нашли больше часов) - но мне не хватает глубоких угловых знаний, чтобы точно знать, что мое не является надлежащим подмножеством набора решений.
$scope
есть массив $$ watchers с количеством наблюдателей на этом контроллере (хорошо, если у вас есть какой-то ng-repeat или что-то, что создает другую область видимости, это не работает так хорошо). Но я думаю, что нет возможности увидеть все часы во всем приложении.