144 votes

Comment compter le nombre total de montres sur une page ?

Existe-t-il un moyen, en JavaScript, de compter le nombre de montres angulaires sur l'ensemble de la page ?

Nous utilisons Batarang mais elle ne répond pas toujours à nos besoins. Notre application est grande et nous souhaitons utiliser des tests automatisés pour vérifier si le nombre de montres augmente trop.

Il serait également utile de compter les montres sur une base par contrôleur.

Modifier Voici ma tentative. Il compte les montres dans tout ce qui a la classe 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;
})();

0 votes

Par contrôleur, c'est facile. Chaque $scope a un tableau $$watchers avec le nombre de surveillants sur ce contrôleur (bien, si vous avez un ng-repeat ou quelque chose qui crée une autre portée, cela ne fonctionne pas si bien). Mais je pense qu'il n'y a aucun moyen de voir tous les observateurs dans l'application entière.

1voto

Arlen Beiler Points 1619

La réponse de Plantian est plus rapide : https://stackoverflow.com/a/18539624/258482

Voici une fonction que j'ai écrite à la main. Je n'ai pas pensé à utiliser des fonctions récursives, mais c'est ce que j'ai fait à la place. C'est peut-être plus léger, je ne sais pas.

var logScope; //put this somewhere in a global piece of code

Ensuite, placez ceci dans votre contrôleur le plus élevé (si vous utilisez un contrôleur global).

$scope.$on('logScope', function () { 
    var target = $scope.$parent, current = target, next;
    var count = 0;
    var count1 = 0;
    var checks = {};
    while(count1 < 10000){ //to prevent infinite loops, just in case
        count1++;
        if(current.$$watchers)
            count += current.$$watchers.length;

        //This if...else is also to prevent infinite loops. 
        //The while loop could be set to true.
        if(!checks[current.$id]) checks[current.$id] = true;
        else { console.error('bad', current.$id, current); break; }
        if(current.$$childHead) 
            current = current.$$childHead;
        else if(current.$$nextSibling)
            current = current.$$nextSibling;
        else if(current.$parent) {
            while(!current.$$nextSibling && current.$parent) current = current.$parent;
            if(current.$$nextSibling) current = current.$$nextSibling;
            else break;
        } else break;
    }
    //sort of by accident, count1 contains the number of scopes.
    console.log('watchers', count, count1);
    console.log('globalCtrl', $scope); 
   });

logScope = function () {
    $scope.$broadcast('logScope');
};

Et enfin un marché aux livres :

javascript:logScope();

0voto

makrigia Points 250

C'est un peu tard pour répondre à cette question, mais j'utilise ceci

angular.element(document.querySelector('[data-ng-app]')).scope().$$watchersCount

Assurez-vous simplement que vous utilisez le bon querySelector.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X