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