循环遍历角度对象上的所有控制器

时间:2014-02-12 08:31:46

标签: angularjs

是否可以从全局windowwindow.angular对象循环遍历我们创建并正在引导的所有控制器/模块/工厂等?

我在想:

for(module in window.angular.modules) {
  for(ctrl in module.controllers) {
    console.log(ctrl);
  }
  for(factory in module.factories) {
    console.log(factory);
  }
  ...
}

目标:我想为我们创建的应用自动生成一些文档。

修改 请注意,我们在执行控制器时不会创建全局对象。我们直接在模块上注册它们:

angular.module('ourApp')
  .controller('CustomerCtrl', ['$scope', function ($scope) { ... } ]);

2 个答案:

答案 0 :(得分:2)

angular模块包含一个名为_invokeQueue的属性,该属性包含属于此模块一部分的所有子模块的数组。

console.log(angular.module('ourApp')._invokeQueue);

打印类似

的内容
[
    ['$provide', 'factory', Arguments['myFactory', ['$dependency1', '$dependency2', function(){}],
    ['$provide', 'service', Arguments['myService', ['$dependency1', '$dependency2', function(){}]
    ['$provide', 'constant', Arguments['myConstant', ['$dependency1', '$dependency2', function(){}]
    ['$controllerProvider', 'register', Arguments['myController', ['$dependency1', '$dependency2', function(){}]
    ...
]

注意:如果您正在构建文档生成应用程序,那么在我看来,您不应该循环所有已注册的模块,因为有许多内置的角度模块(ngngRoute等,你可能不在乎。您应该指定要记录的模块。

答案 1 :(得分:0)

在浏览器控制台中运行:

从角度应用程序获取已注册控制器的列表

angular.module('appname')._invokeQueue.filter(function(comp){return comp[0] === '$controllerProvider'}).forEach(function(ctrl){console.log(ctrl[2][0]);})

从角度应用

获取已注册的提供商列表

angular.module('appname')._invokeQueue.filter(function(comp){return comp[0] === '$provide'}).forEach(function(ctrl){console.log(ctrl[2][0]);})