AngularJS - 获取所有注册服务的列表?

时间:2013-10-16 18:56:28

标签: angularjs

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

4 个答案:

答案 0 :(得分:62)

你可以获得每个模块的提供者列表(即服务/指令/控制器/工厂/等),尽管列表有点神秘。

说你有以下内容:

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){ ... });
...

然后mod变量将包含一个名为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

但那只包含该特定模块的提供者列表。如果要获取所有依赖模块的列表,则需要遍历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
});

希望有所帮助。

答案 1 :(得分:35)

试试这个:

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

答案 2 :(得分:30)

以下是获得大多数服务的方法

即:常量工厂服务

    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()返回undefined的某些情况下,上述函数可能会失败。你可以使用下面的函数......


替代方法

    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.时,您将获得一个自动完成的列表。


注意:无论使用哪种方法,请务必使用模块名称替换'MyApp'

答案 3 :(得分:0)

我创建了一个GitHub要点,其中包含一些可以Graphviz友好格式输出依赖关系的代码。这意味着您应该能够可视化依赖图。

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