Я могу получить список всех зарегистрированных директив, сервисов, контроллеров, и т.д. во времени выполнения...?
Можно получить список поставщиков (т.е. сервисы/директивы/контроллеры/фабрики/и т.д.) для каждого модуля, хотя список является довольно загадочным.
Говорят, что у Вас есть следующее:
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
});
Hope, которая помогает.
Я создал суть GitHub с некоторым кодом, который может произвести зависимости в Graphviz дружественный формат. Что означает, что необходимо смочь визуализировать граф зависимостей.
См. https://gist.github.com/dlidstrom/a2f787cef41ea4fcb8aa74d459f49270.
Попробуйте это:
angular.module('MyApp')['_invokeQueue'].forEach(function(value){
console.log(value[1] + ": " + value[2][0]);
})
Т.е.: константы , значения , фабрики , сервисы .
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()
неопределенные возвраты. Можно использовать функцию ниже вместо этого...
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'
Вашим модуль имя.