angularjs – 如何计算一个页面上的watch总数?

前端之家收集整理的这篇文章主要介绍了angularjs – 如何计算一个页面上的watch总数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在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元素的数据属性,而不是它的类。我在这里跑你的:

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');
        }
    }
}

没有什么打印出来,所以我猜我的是更好的(因为它发现更多的手表) – 但我缺乏亲密的角度知识,知道我肯定不是解决方案集的一个适当的子集。

猜你在找的Angularjs相关文章