是否可以从全局window
或window.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) { ... } ]);
答案 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(){}]
...
]
注意:如果您正在构建文档生成应用程序,那么在我看来,您不应该循环所有已注册的模块,因为有许多内置的角度模块(ng
,ngRoute
等,你可能不在乎。您应该指定要记录的模块。
答案 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]);})