(您可能需要更改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);
})();
原版的
除了检查HTML元素的data属性而不是其类之外,我执行了相同的操作。我在这里跑了你的:
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或创建另一个作用域的东西,那么效果就不好了)。但我认为无法查看整个应用程序中的所有手表。