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

bla*_*ter 62 angularjs

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

ten*_*ent 64

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

说你有以下内容:

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){ ... });
...
Run Code Online (Sandbox Code Playgroud)

然后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(){}]
    ...
]
Run Code Online (Sandbox Code Playgroud)

因此,您可以搜索mod._invokeQueue它包含的每个提供程序.

但那只包含该特定模块的提供者列表.如果要获取所有相关模块的列表,则需要循环遍历该mod.requires数组.

如果模块具有模块级依赖关系,如下所示:

var mod = angular.module('myModule', ['otherModule1','otherModule2']);
Run Code Online (Sandbox Code Playgroud)

然后该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
});
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 其实你可以.您可以直接在Chrome控制台中注册新模块/控制器等,甚至可以从IE或支持控制台的任何其他浏览器注册.如果您输入控制台angular.module('myApp')._ invokeQueue,您将看到所有已注册组件的数组. (6认同)
  • 谢谢!很有帮助.我希望Angular能够以更友善的方式暴露一些关于自身的元数据 - getServices()等. (3认同)

小智 37

试试这个:

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


Gil*_*man 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');
Run Code Online (Sandbox Code Playgroud)

现在,当您在控制台中输入时,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');
Run Code Online (Sandbox Code Playgroud)

现在,当您在控制台中输入时,allMyServices.您将获得一个自动完成列表.


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