Angular – 获取所有注册服务的列表?

我可以在运行时获得所有已注册的指令,服务,控制器等的列表吗? 。 。 ?

你可以得到每个模块的提供者列表(即服务/指令/控制器/工厂/等),虽然列表是一种神秘的。

假设你有以下几点:

var mod = angular.module('myModule', []); mod.factory('fact1', function($dependency1, $dependency2){ ... }); mod.service('serv1', function($dependency3, $dependency4){ ... }); mod.controller('ctrl1', function($dependency2, $dependency3){ ... }); mod.factory('fact2', function($dependency1, $dependency4){ ... }); ... 

然后, modvariables将包含一个名为mod._invokeQueue的属性,该属性将包含属于该模块一部分的所有提供者的数组。 _invokeQueue将如下所示:

 [ ['$provide', 'factory', Arguments['fact1', ['$dependency1', '$dependency2', function(){}], ['$provide', 'service', Arguments['serv1', ['$dependency3', '$dependency4', function(){}], ['$provide', 'controller', Arguments['ctrl1', ['$dependency2', '$dependency3', function(){}], ['$provide', 'factory', Arguments['fact2', ['$dependency1', '$dependency4', function(){}] ... ] 

所以你可以通过它包含的每个提供者的mod._invokeQueue进行search。

但是那只包含特定模块的提供者列表。 如果你想得到所有依赖模块的列表,你将需要遍历mod.requires数组。

如果模块具有模块级别的依赖性,如下所示:

 var mod = angular.module('myModule', ['otherModule1','otherModule2']); 

然后, mod对象也将有一个mod.requires数组,其中包含这些模块依赖关系的名称,如下所示:

 angular.forEach(mod.requires, function(requiredModuleName){ // first get a reference to the required module by calling angular.module() var requiredMod = angular.module(requiredModuleName); // requiredMod will have its own ._invokeQueue // requiredMod._invokeQueue will look like the _invokeQueue from above ... // do something with the additional providers in _invokeQueue }); 

希望有所帮助。

尝试这个:

 angular.module('MyApp')['_invokeQueue'].forEach(function(value){ console.log(value[1] + ": " + value[2][0]); }) 

以下是如何获得大部分服务

即: 常量工厂服务

  function allServices(mod, r) { var inj = angular.element(document).injector().get; if (!r) r = {}; angular.forEach(angular.module(mod).requires, function(m) {allServices(m,r)}); angular.forEach(angular.module(mod)._invokeQueue, function(a) { try { r[a[2][0]] = inj(a[2][0]); } catch (e) {} }); return r; }; allMyServices = allServices('myApp'); 

现在,当你在控制台中allMyServices. 你会得到一个自动完成的列表。


angular.element(document).injector()返回未定义的某些情况下,上面的函数可能会失败。 您可以使用下面的function,而不是…


替代方法

  var inj; function allServices(mod, r) { if (!r) { r = {}; inj = angular.element(document.querySelector('[ng-app]')).injector().get; } angular.forEach(angular.module(mod).requires, function(m) {allServices(m,r)}); angular.forEach(angular.module(mod)._invokeQueue, function(a) { try { r[a[2][0]] = inj(a[2][0]); } catch (e) {} }); return r; }; allMyServices = allServices('myApp'); 

现在,当你在控制台中allMyServices. 你会得到一个自动完成的列表。


注意:无论使用哪种方法,都要确保使用模块名称replace'MyApp'

我创build了一个GitHub gist,其中有一些代码可以以Graphviz友好的格式输出依赖关系。 这意味着你应该能够可视化依赖关系图。

请参阅https://gist.github.com/dlidstrom/a2f787cef41ea4fcb8aa74d459f49270