AngularJS - Получить список всех зарегистрированных услуг?
Могу ли я получить список всех зарегистрированных директив, служб, контроллеров и т. Д. Во время выполнения.,,?
4 ответа
Вы можете получить список провайдеров (то есть сервисов / директив / контроллеров / фабрик / и т. Д.) Для каждого модуля, хотя этот список довольно загадочный.
Скажем, у вас есть следующее:
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
});
Надеюсь, это поможет.
Попробуй это:
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'
с вашим именем модуля.
Я создал GitHub Gist с некоторым кодом, который может выводить зависимости в удобном для Graphviz формате. Это означает, что вы должны иметь возможность визуализировать график зависимости.
См. https://gist.github.com/dlidstrom/a2f787cef41ea4fcb8aa74d459f49270.