在JavaScript中有没有办法计算整个页面上的有角度的手表的数量?
我们使用Batarang,但它并不总是适合我们的需要。我们的应用程序很大,我们有兴趣使用自动化测试来检查观察计数是否增加太多。
在每个控制器基础上对手表进行计数也是有用的。
编辑:这里是我的尝试。它在ng-scope类的所有内容中统计手表。
(function () { var elts = document.getElementsByClassName('ng-scope'); var watches = []; var visited_ids = {}; for (var i=0; i < elts.length; i++) { var scope = angular.element(elts[i]).scope(); if (scope.$id in visited_ids) continue; visited_ids[scope.$id] = true; watches.push.apply(watches,scope.$$watchers); } return watches.length; })();
(你可能需要改变身体到HTML或你放置你的ng应用程序)
(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); })();
>感谢erilem指出这个答案缺少$ isolateScope搜索和观察者可能在他/她的答案/评论中重复。
>感谢Ben2307指出“身体”可能需要更改。
原版的
我做了同样的事情,除了我检查的HTML元素的数据属性,而不是它的类。我在这里跑你的:
得到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'); } } }
没有什么打印出来,所以我猜我的是更好的(因为它发现更多的手表) – 但我缺乏亲密的角度知识,知道我肯定不是解决方案集的一个适当的子集。