(Möglicherweise müssen Sie body
zu html
oder wo immer Sie Ihre ändern 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);
})();
Dank an erilem für den Hinweis auf diese Antwort fehlte die $isolateScope
Suche und die Beobachter wurden möglicherweise in seiner Antwort / ihrem Kommentar dupliziert.
Vielen Dank an Ben2307 für den Hinweis, dass das 'body'
möglicherweise geändert werden muss.
Original
Ich habe das Gleiche getan, außer dass ich das Datenattribut des HTML-Elements und nicht dessen Klasse überprüft habe. Ich habe deine hier geführt:
http://fluid.ie/
Und bekam 83. Ich lief meine und bekam 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);
})();
Ich habe das auch in meine aufgenommen:
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');
}
}
}
Und nichts wurde ausgedruckt, also schätze ich, dass meine besser ist (da sie mehr Uhren gefunden hat) - aber mir fehlt intimes Winkelwissen, um sicher zu sein, dass meine keine richtige Teilmenge der Lösungsmenge ist.
$scope
hat ein $$ watchers-Array mit der Anzahl der Watcher auf diesem Controller (wenn Sie eine ng-Wiederholung haben oder etwas, das einen anderen Bereich erstellt, funktioniert das nicht so gut). Aber ich denke, dass es keine Möglichkeit gibt, alle Uhren in der gesamten App zu sehen.