Existe uma maneira, em JavaScript, de contar o número de relógios angulares em toda a página?
Usamos Batarang , mas nem sempre atende às nossas necessidades. Nossa aplicação é grande e estamos interessados em usar testes automatizados para verificar se a contagem de visualizações aumenta demais.
Também seria útil contar relógios em uma base por controlador.
Edit : aqui está a minha tentativa. Conta relógios em tudo com 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
um possui uma matriz de observadores $$ com o número de observadores nesse controlador (bem, se você tiver algum ng-repeat ou algo que crie outro escopo, que não funcione tão bem). Mas acho que não há como ver todos os relógios em todo o aplicativo.Respostas:
(Pode ser necessário mudar
body
parahtml
ou onde quer que você coloqueng-app
)Obrigado a erilem por apontar que esta resposta estava faltando na
$isolateScope
pesquisa e os observadores estavam potencialmente duplicados em sua resposta / comentário.Agradecemos a Ben2307 por apontar que
'body'
talvez seja necessário alterar.Original
Fiz a mesma coisa, exceto que verifiquei o atributo de dados do elemento HTML em vez de sua classe. Eu corri o seu aqui:
http://fluid.ie/
E tenho 83. Corri o meu e tenho 121.
Eu também coloquei isso no meu:
E nada foi impresso, então acho que o meu é melhor (na medida em que encontrou mais relógios) - mas não tenho conhecimento angular íntimo para ter certeza de que o meu não é um subconjunto adequado do conjunto de soluções.
fonte
$scope
e do$$watcher
automático, ou há um impacto no desempenho em que eles ocorrem?$compileProvider.debugInfoEnabled(false);
em seu projeto, esse snippet contará zero observadores.Eu acho que as abordagens mencionadas são imprecisas, pois contam o número de observadores no mesmo escopo. Aqui está minha versão de um bookmarklet:
https://gist.github.com/DTFagus/3966db108a578f2eb00d
Também mostra mais alguns detalhes para analisar observadores.
fonte
Aqui está uma solução hacky que eu montei com base na inspeção das estruturas de escopo. Parece "funcionar". Não sei ao certo se isso é preciso e, definitivamente, depende de alguma API interna. Estou usando o angularjs 1.0.5.
fonte
$rootScope.$new(true)
ou$scope.$new(true)
, onde$scope
é o controlador, a caminhada na hierarquia ainda o encontrará. Eu acho que isso significa que os protótipos não estão conectados, e que o escopo não está na hierarquia.Existe um novo plug-in do Chrome que mostra automaticamente o total de observadores atuais e a última alteração (+/-) a qualquer momento no seu aplicativo ... é incrível.
https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk
fonte
Como recentemente também estava enfrentando um grande número de observadores em meu aplicativo, descobri uma ótima biblioteca chamada ng-stats - https://github.com/kentcdodds/ng-stats . Possui configuração mínima e fornece o número de observadores na página atual + duração do ciclo de resumo. Também poderia projetar um pequeno gráfico em tempo real.
fonte
Pequena melhoria para a resposta de Words Like Jared .
fonte
No AngularJS 1.3.2, um
countWatchers
método foi adicionado ao módulo ngMock:Referências
Registro de alterações do AngularJS: 1.3.2
ngMock: $ rootScope.Scope. $ countWatchers
fonte
angular.element(document)
paraangular.element('[ng-app]')
e coloquei em um bookmarklet com um alerta:alert('found ' + countWatchers() + ' watchers');
Peguei o código abaixo diretamente da
$digest
própria função. Obviamente, você provavelmente precisará atualizar o seletor de elementos do aplicativo (document.body
) na parte inferior.fonte
Estas são as funções que eu uso:
Esta função usa um hash para não contar o mesmo escopo várias vezes.
fonte
element.data()
Às vezes, acho que pode ser indefinido ou algo assim (pelo menos em um aplicativo 1.0.5 em que ocorreu um erro quando executei esse snippet e tentei ligarcountWatchers
). Apenas para sua informação.Há uma função recursiva publicada pelo blog de Lars Eidnes em http://larseidnes.com/2014/11/05/angularjs-the-bad-parts/ para coletar o número total de observadores. Comparo o resultado usando a função postada aqui e a que ele postou em seu blog, que gerou um número um pouco maior. Não sei dizer qual é mais preciso. Apenas adicionado aqui como uma referência geral.
NOTA: pode ser necessário alterar "ng-app" para "data-ng-app" no seu aplicativo Angular.
fonte
A resposta de Plantian é mais rápida: https://stackoverflow.com/a/18539624/258482
Aqui está uma função que eu escrevi à mão. Não pensei em usar funções recursivas, mas foi o que fiz. Pode ser mais enxuto, não sei.
Em seguida, coloque isso dentro do seu controlador mais alto (se você usar um controlador global).
E finalmente um mercado de livros:
fonte
Um pouco tarde para esta pergunta, mas eu uso isso
apenas certifique-se de usar o querySelector correto.
fonte