(Vous devrez peut-être changer body
a html
ou partout où vous mettez votre 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);
})();
-
Merci à erilem d'avoir signalé que cette réponse ne comportait pas le champ $isolateScope
la recherche et les observateurs étant potentiellement dupliqués dans leur réponse/commentaire.
-
Merci à Ben2307 d'avoir signalé que l'option 'body'
devra peut-être être modifié.
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 analysé le vôtre ici :
http://fluid.ie/
Et j'ai eu 83. J'ai testé le mien et j'ai eu 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);
})();
J'ai aussi mis ça dans le mien :
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');
}
}
}
Et rien ne s'est imprimé, donc je suppose que la mienne est meilleure (dans la mesure où elle a trouvé plus de montres) - mais je n'ai pas de connaissances angulaires approfondies pour savoir avec certitude que la mienne n'est pas un sous-ensemble approprié de l'ensemble des solutions.
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.