我是否可以获取所有已注册指令,服务,控制器等的列表在运行时。 。 。 ?
答案 0 :(得分:62)
你可以获得每个模块的提供者列表(即服务/指令/控制器/工厂/等),尽管列表有点神秘。
说你有以下内容:
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
的属性,该属性将包含属于该模块的所有提供者的数组。 _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
});
希望有所帮助。
答案 1 :(得分:35)
试试这个:
angular.module('MyApp')['_invokeQueue'].forEach(function(value){
console.log(value[1] + ": " + value[2][0]);
})
答案 2 :(得分:30)
即:常量,值,工厂,服务。
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'
。答案 3 :(得分:0)
我创建了一个GitHub要点,其中包含一些可以Graphviz友好格式输出依赖关系的代码。这意味着您应该能够可视化依赖图。
请参阅https://gist.github.com/dlidstrom/a2f787cef41ea4fcb8aa74d459f49270。