2016-08-23 84 views
9

是否有可能获得我定义的所有角度控制器的列表?基本上我想能够确定哪些files我需要导入(我写的)取决于哪些使用。我能想到的唯一方法是遍历HTML并找到与ng-controller相关的所有值,但我想知道是否有更清晰,更强大的方法。获取所有角度控制器

+0

我很高兴你没有按照你原来的想法去做,因为......如果你遍历HTML,如果人们使用** ui-router **和'controllerAs '。 – byxor

+0

@BrandonIbbotson它更像是一种内部hacky解决方案,所有控制器都使用'ng-controller',所以它不会太成问题。我知道'ui-router',但它没有被用于这个。有什么建议么? –

+0

'ngRoute'也允许为特定的html定义控制器到js配置文件。 – nubinub

回答

1

尝试使用_invokeQueue这可能是你在找什么:

angular.module('MyApp')['_invokeQueue'].forEach(function(val‌​ue){ console.log(value[2][0]) }) 

的_invokeQueue填充了使用熟悉的angular.module加入 模块每个服务('Mymodule中').controller, angular.module('myModule')。directive et al。调用。 队列中的每个项目都是一个包含三个元素的数组。第一个是 将调用该服务的提供者,第二个是提供者的方法 的使用,第三个元素是传递给 服务的任何参数的数组。

Reference

1

您可以通过使用该模块的_invokeQueue物业这样做,如图this example

var appModule = angular.module('plunker',[]); 

angular.module('plunker').controller('TestCtrl', function(){}); 
angular.module('plunker').controller('TestCtrl2', function(){}); 
angular.module('plunker').controller('MainCtrl', function($scope) { 
    $scope.controllers = appModule._invokeQueue.filter(function(el){ 
     return el[0] === "$controllerProvider"; 
    }).map(function(el){ 
     return el[2]["0"]; 
    }); 
}); 
1

在任何现有的控制器,复制并粘贴下面的代码会 列出你所有的控制器。

注意:请用'app'更改您的应用程序变量。

var app = angular.module('myApp',[]); 

angular.element(document).ready(function(){ 
     var values = app._invokeQueue; 
     angular.forEach(values, function(value, key) { 
      if(value[0] == '$controllerProvider'){ 
       console.log(value[2][0]); 
      } 
     }); 
    });