¿Hay alguna manera, en JavaScript, de contar el número de relojes angulares en toda la página?
Usamos Batarang , pero no siempre se adapta a nuestras necesidades. Nuestra aplicación es grande y estamos interesados en utilizar pruebas automatizadas para verificar si el recuento de relojes aumenta demasiado.
También sería útil contar los relojes por controlador.
Editar : aquí está mi intento. Cuenta relojes en todo con clase 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
tiene una matriz $$ watchers con el número de observadores en ese controlador (bueno, si tienes alguna repetición ng o algo que crea otro alcance, eso no funciona tan bien). Pero creo que no hay forma de ver todos los relojes en toda la aplicación.Respuestas:
(Es posible que deba cambiar
body
ahtml
o donde sea que coloque sung-app
)Gracias a erilem por señalar que esta respuesta no se realizó la
$isolateScope
búsqueda y los observadores posiblemente se duplicaron en su respuesta / comentario.Gracias a Ben2307 por señalar que es
'body'
posible que sea necesario cambiarlo.Original
Hice lo mismo, excepto que verifiqué el atributo de datos del elemento HTML en lugar de su clase. Corrí el tuyo aquí:
http://fluid.ie/
Y obtuve 83. Corrí el mío y obtuve 121.
También puse esto en el mío:
Y no se imprimió nada, así que supongo que el mío es mejor (en el sentido de que encontró más relojes), pero me falta un conocimiento angular íntimo para saber con certeza que el mío no es un subconjunto adecuado del conjunto de soluciones.
fuente
$scope
y$$watcher
automática, o hay un impacto en el rendimiento en el que incurren?$compileProvider.debugInfoEnabled(false);
en su proyecto, este fragmento contará cero observadores.Creo que los enfoques mencionados son inexactos ya que cuentan a los observadores en el mismo alcance doble. Aquí está mi versión de un marcador:
https://gist.github.com/DTFagus/3966db108a578f2eb00d
También muestra algunos detalles más para analizar a los observadores.
fuente
Aquí hay una solución hacky que armé en base a la inspección de las estructuras del alcance. Parece funcionar. No estoy seguro de cuán preciso es esto y definitivamente depende de alguna API interna. Estoy usando angularjs 1.0.5.
fuente
$rootScope.$new(true)
o$scope.$new(true)
, donde$scope
es para el controlador, entonces caminar por la jerarquía aún encuentra ese ámbito. Creo que significa que los prototipos no están conectados en lugar de que el alcance no esté en la jerarquía.Hay un nuevo complemento de Chrome que muestra automáticamente los observadores totales actuales y el último cambio (+/-) en cualquier momento en su aplicación ... es absolutamente increíble.
https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk
fuente
Como recientemente estaba luchando con un gran número de observadores en mi aplicación, también descubrí una gran biblioteca, llamada ng-stats - https://github.com/kentcdodds/ng-stats . Tiene una configuración mínima y le brinda la cantidad de observadores en la página actual + duración del ciclo de resumen. También podría proyectar un pequeño gráfico en tiempo real.
fuente
Mejora menor para la respuesta de Words Like Jared .
fuente
En AngularJS 1.3.2,
countWatchers
se agregó un método al módulo ngMock:Referencias
Registro de cambios AngularJS: 1.3.2
ngMock: $ rootScope.Scope. $ countWatchers
fuente
angular.element(document)
aangular.element('[ng-app]')
y lo puso en un bookmarklet con una alerta:alert('found ' + countWatchers() + ' watchers');
Tomé el siguiente código directamente de la
$digest
función en sí. Por supuesto, probablemente necesite actualizar el selector de elementos de la aplicación (document.body
) en la parte inferior.fuente
Estas son las funciones que uso:
Esta función utiliza un hash para no contar el mismo alcance varias veces.
fuente
element.data()
veces puede ser indefinido o algo así (al menos en una aplicación 1.0.5 en la que recibí un error cuando ejecuté este recorte e intenté llamarcountWatchers
). Solo para tu información.Hay una función recursiva publicada por el blog de Lars Eidnes en http://larseidnes.com/2014/11/05/angularjs-the-bad-parts/ para recopilar el número total de observadores. Comparo el resultado usando la función publicada aquí y la que publicó en su blog, que ha generado un número ligeramente mayor. No puedo decir cuál es más preciso. Acabo de agregar aquí como referencia cruzada.
NOTA: es posible que necesite cambiar "ng-app" a "data-ng-app" para su aplicación Angular.
fuente
La respuesta de Plantian es más rápida: https://stackoverflow.com/a/18539624/258482
Aquí hay una función que escribí a mano. No pensé en usar funciones recursivas, pero esto es lo que hice en su lugar. Puede ser más delgado, no lo sé.
Luego ponga esto dentro de su controlador más alto (si usa un controlador global).
Y finalmente un mercado de libros:
fuente
Un poco tarde para esta pregunta, pero yo uso esto
solo asegúrese de utilizar el querySelector correcto.
fuente