65

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

4

4 回答 4

65

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

假设您有以下内容:

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

希望有帮助。

于 2013-10-16T19:34:36.940 回答
42

试试这个:

angular.module('MyApp')['_invokeQueue'].forEach(function(value){ 
    console.log(value[1] + ": " + value[2][0]);
})
于 2014-12-17T20:06:36.567 回答
31

获取大多数服务的方法如下

即:常量工厂服务

    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()在返回未定义的某些情况下,上述函数可能会失败。您可以改用下面的功能...


替代方法

    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'为您的模块名称。

于 2014-07-12T08:28:43.433 回答
0

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

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

于 2017-10-25T09:07:15.547 回答