AngularJs – obter lista de todos os módulos cadastrados

Posso obter uma lista de todos os módulos registrados em tempo de execução?

Por exemplo:

// Some code somewhere in some .js file var module1 = angular.module('module1', []); // Some code in some other .js file var module2 = angular.module('module2', []); // Main .js file var arrayWithNamesOfAllRegisteredModules = ..... // (result would be: ['module1', 'module2']) 

Angular não fornece uma maneira de recuperar a lista de módulos registrados (pelo menos eu não consegui encontrar um caminho no código-fonte). No entanto, você pode decorar o método angular.module para armazenar nomes na matriz. Algo assim:

 (function(orig) { angular.modules = []; angular.module = function() { if (arguments.length > 1) { angular.modules.push(arguments[0]); } return orig.apply(null, arguments); } })(angular.module); 

Agora você pode verificar o array angular.modules .

Demonstração: http://plnkr.co/edit/bNUP39cbFqNLbXyRqMex?p=preview

Você pode simplesmente fazer:

 console.log(angular.module('ModuleYouWantToInspect').requires); 

Deve retornar de um array de strings (dependencies). Você pode fazer o mesmo para a saída.

Se você estiver depurando, descobri que você pode obter a lista por:

Encontre ou adicione código para chamar run () de qualquer módulo com qualquer corpo, por exemplo:

 angular.module('myModule') .run(function() {}) 

Coloque um ponto de interrupção no .run e entre em angular.run (). Existe um object chamado “módulos” no escopo que possui todos os módulos como propriedades, por nome.

Isso pode funcionar com outros methods de módulo também ou ser acessível a partir do código; Eu não tentei muito entender a imagem maior.

Melhorando a solução

 (function(angular) { var orig = angular.module; angular.modules = []; angular.modules.select = function(query) { var cache = [], reg = new RegExp(query || '.*'); for(var i=0,l=this.length;i< l;i++){ var item = this[i]; if(reg.test(item)){ cache.push(item) } } return cache; } angular.module = function() { var args = Array.prototype.slice.call(arguments); if (arguments.length > 1) { angular.modules.push(arguments[0]); } return orig.apply(null, args); } })(angular); 

Agora você pode selecionar módulos:

 angular.modules.select('app.modules.*') 

Criando a tree de módulos:

 var app = angular.module('app.module.users', ['ui.router'...]); var app = angular.module('app.module.users.edit', ['app.modules.users']); 

Seu aplicativo de módulo principal (submódulos de concatenação)

 angular.module('app', ['ui.bootstrap', 'app.services', 'app.config'] .concat(angular.modules.select('app.module.*'))); 

além de responder @dfsq você pode obter lista de módulos com dependencies

 var AngularModules = (function (angular) { function AngularModules() { extendAngularModule(); angular.element(document).ready(function () { getModulesDependencies(); }); } var extendAngularModule = function () { var orig = angular.module; angular.modules = []; angular.module = function () { var args = Array.prototype.slice.call(arguments); var modules = []; if (arguments.length > 1) { modules.push(arguments[0]); } for (var i = 0; i < modules.length; i++) { angular.modules.push({ 'module': modules[i] }); } return orig.apply(null, args); }; }; var getModulesDependencies = function () { for (var i = 0; i < angular.modules.length; i++) { var module = angular.module(angular.modules[i].module); angular.modules[i].dependencies = module && module.hasOwnProperty('requires') ? module.requires : []; } }; return AngularModules; })(angular); 

Uso:

 var modules = new AngularModules(); 

Dado um angular.element, o array $ injector.modules contém a lista de módulos registrados.

por exemplo

 angular.element(document.body).injector().modules 

Há uma pergunta semelhante com melhores respostas aqui https://stackoverflow.com/a/19412176/132610 , um resumo do que eles propuseram é:

 var app = angular.module('app', []); # app.service(/**your injections*/) etc # to access to the list of services + injections app._invokeQueue #has following form: [ [ '$provide', 'service', Arguments[ 'serviceName', [ '$dependency1', '$dependency2', function(){} ], ] ] ] 

Isso envolve explorar os detalhes da implementação que podem mudar com o tempo, mas você pode tentar isso.

  • Carregue a página totalmente.
  • Defina um ponto de interrupção dentro de angular.module ().
  • Chame angular.module () no console.
  • Quando você atingir o ponto de interrupção, execute a impressão do dictionary de módulos console.dir(modules) ou se você deseja copiá-lo em outro editor window.prompt('', JSON.stringify(modules))

Isso funciona porque nos bastidores o angular constrói um dictionary dos módulos carregados chamados módulos. Você também quer esperar até terminar de carregar todos os módulos para que eles estejam no dictionary.