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

rn0zuynd  于 2022-12-26  发布在  Angular
关注(0)|答案(4)|浏览(153)

我可以得到一个所有注册的指令、服务、控制器等的列表吗?

kd3sttzy

kd3sttzy1#

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

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的属性,该属性将包含该模块中所有提供程序的数组。

[
    ['$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
});
cnh2zyt3

cnh2zyt32#

试试这个:

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

wvt8vs2t3#

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

例如:常量工厂服务

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

w8f9ii69

w8f9ii694#

我用一些代码创建了一个GitHub gist,它可以以Graphviz友好的格式输出依赖关系,这意味着您应该能够可视化依赖关系图。
参见https://gist.github.com/dlidstrom/a2f787cef41ea4fcb8aa74d459f49270

相关问题