Existe-t-il un moyen, en JavaScript, de compter le nombre de montres angulaires sur toute la page?
Nous utilisons Batarang , mais cela 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 par contrôleur.
Edit : voici ma tentative. Il compte les montres dans tout avec 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;
})();
$scope
a un tableau $$ watchers avec le nombre d'observateurs sur ce contrôleur (enfin, si vous avez un ng-repeat ou quelque chose qui crée une autre portée, cela ne fonctionne pas très bien). Mais je pense qu'il n'y a aucun moyen de voir toutes les montres dans toute l'application.Réponses:
(Vous devrez peut-être changer
body
de lieuhtml
ou de lieu où vous mettez votreng-app
)Merci à erilem d'avoir signalé que cette réponse manquait la
$isolateScope
recherche et que les observateurs étaient potentiellement dupliqués dans sa réponse / commentaire.Merci à Ben2307 pour avoir signalé que le
'body'
peut avoir besoin d'être changé.Original
J'ai fait la même chose sauf que j'ai vérifié l'attribut data de l'élément HTML plutôt que sa classe. J'ai couru le vôtre ici:
http://fluid.ie/
Et j'ai eu 83. J'ai couru le mien et j'ai obtenu 121.
J'ai aussi mis ceci dans le mien:
Et rien n'est imprimé, donc je suppose que le mien est meilleur (en ce sens qu'il a trouvé plus de montres) - mais je manque de connaissances angulaires intimes pour savoir avec certitude que le mien n'est pas un sous-ensemble approprié de l'ensemble de solutions.
la source
$scope
et$$watcher
automatique est-il automatique, ou y a-t-il un impact sur les performances?$compileProvider.debugInfoEnabled(false);
dans votre projet, cet extrait de code ne comptera aucun observateur.Je pense que les approches mentionnées sont inexactes puisqu'elles comptent les observateurs dans le même périmètre double. Voici ma version d'un bookmarklet:
https://gist.github.com/DTFagus/3966db108a578f2eb00d
Il montre également quelques détails supplémentaires pour analyser les observateurs.
la source
Voici une solution hacky que j'ai mise en place basée sur l'inspection des structures de portée. Cela "semble" fonctionner. Je ne sais pas à quel point cela est précis et cela dépend certainement d'une API interne. J'utilise angularjs 1.0.5.
la source
$rootScope.$new(true)
ou$scope.$new(true)
, où$scope
est pour le contrôleur, alors parcourir la hiérarchie trouve toujours cette étendue. Je pense que cela signifie que les prototypes ne sont pas connectés au lieu que la portée ne soit pas dans la hiérarchie.Il existe un nouveau plugin Chrome qui affiche automatiquement le nombre total d'observateurs actuels et le dernier changement (+/-) à tout moment dans votre application ... c'est vraiment génial.
https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk
la source
Comme je me débattais récemment avec un grand nombre d'observateurs dans mon application, j'ai découvert une excellente bibliothèque, appelée ng-stats - https://github.com/kentcdodds/ng-stats . Il a une configuration minimale et vous donne le nombre d'observateurs sur la page actuelle + la durée du cycle de résumé. Il pourrait également projeter un petit graphique en temps réel.
la source
Amélioration mineure pour la réponse de Words Like Jared .
la source
Dans AngularJS 1.3.2, un
countWatchers
méthode a été ajoutée au module ngMock:Références
Journal des modifications AngularJS: 1.3.2
ngMock: $ rootScope.Scope. $ countWatchers
la source
angular.element(document)
pourangular.element('[ng-app]')
et le mettre dans un bookmarklet avec une alerte:alert('found ' + countWatchers() + ' watchers');
J'ai pris le code ci-dessous directement à partir de la
$digest
fonction elle-même. Bien sûr, vous devez probablement mettre à jour le sélecteur d'élément d'application (document.body
) en bas.la source
Voici les fonctions que j'utilise:
Cette fonction utilise un hachage pour ne pas compter plusieurs fois la même étendue.
la source
element.data()
peut parfois être indéfini ou quelque chose du genre (au moins sur une application 1.0.5 sur laquelle j'ai eu une erreur lorsque j'ai exécuté cette copie et essayé d'appelercountWatchers
). Juste FYI.Il existe une fonction récursive publiée par le blog de Lars Eidnes à l'adresse http://larseidnes.com/2014/11/05/angularjs-the-bad-parts/ pour collecter le nombre total d'observateurs. Je compare le résultat en utilisant la fonction publiée ici et celle qu'il a publiée dans son blog, qui a généré un nombre légèrement plus élevé. Je ne peux pas dire lequel est le plus précis. Juste ajouté ici comme référence transversale.
REMARQUE: vous devrez peut-être remplacer "ng-app" par "data-ng-app" pour votre application Angular.
la source
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 maigre, je ne sais pas.
Ensuite, placez-le dans votre contrôleur le plus élevé (si vous utilisez un contrôleur global).
Et enfin un bookmarket:
la source
Un peu tard pour cette question, mais j'utilise ceci
assurez-vous simplement d'utiliser le bon querySelector.
la source