2014-02-12 77 views
1

是否可以从全局的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) { ... } ]); 
+0

也试着看看http://stackoverflow.com/questions/15250644/angularjs-loading-a-controller-dynamically – Whisher

回答

2

角模块包含称为_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等),你可能不关心。您应该改为指定要记录哪些模块。在浏览器控制台

+0

的console.log(angular.module( 'ourApp')._ invokeQueue) ;我只获得当前模块而不是所有父级。顺便说一句,有办法让模块名称动态@Cotten对不起:) – Whisher

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