AngularJs - получить список всех зарегистрированных модулей
Могу ли я получить список всех зарегистрированных модулей во время выполнения?
Например:
// Some code somewhere in some .js file
var module1 = angular.module('module1', []);
// Some code in some other .js file
var module2 = angular.module('module2', []);
// Main .js file
var arrayWithNamesOfAllRegisteredModules = .....
// (result would be: ['module1', 'module2'])
8 ответов
Angular не предоставляет способ получения списка зарегистрированных модулей (по крайней мере, я не смог найти путь в исходном коде). Однако вы можете украсить angular.module
метод для хранения имен в массиве. Что-то вроде этого:
(function(orig) {
angular.modules = [];
angular.module = function() {
if (arguments.length > 1) {
angular.modules.push(arguments[0]);
}
return orig.apply(null, arguments);
}
})(angular.module);
Теперь вы можете проверить angular.modules
массив.
Демонстрация: http://plnkr.co/edit/bNUP39cbFqNLbXyRqMex?p=preview
Вы можете просто сделать:
console.log(angular.module('ModuleYouWantToInspect').requires);
Он должен возвращать массив строк (зависимостей). Вы можете сделать то же самое для вывода.
С учетом angular.element массив $injector.modules содержит список зарегистрированных модулей.
например
angular.element(document.body).injector().modules
Если вы отлаживаете, я обнаружил, что вы можете получить список по:
Найдите или добавьте код для вызова run() из любого модуля с любым телом, скажем:
angular.module('myModule')
.run(function() {})
Установите точку останова на.run и войдите в angular.run(). В области есть объект под названием "модули", который имеет все модули в качестве свойств по имени.
Это может работать и с другими методами модуля или быть доступным из кода; Я не очень старался понять общую картину.
Улучшающее решение
(function(angular) {
var orig = angular.module;
angular.modules = [];
angular.modules.select = function(query) {
var cache = [], reg = new RegExp(query || '.*');
for(var i=0,l=this.length;i< l;i++){
var item = this[i];
if(reg.test(item)){
cache.push(item)
}
}
return cache;
}
angular.module = function() {
var args = Array.prototype.slice.call(arguments);
if (arguments.length > 1) {
angular.modules.push(arguments[0]);
}
return orig.apply(null, args);
}
})(angular);
Теперь вы можете выбрать модули:
angular.modules.select('app.modules.*')
Создание дерева модулей:
var app = angular.module('app.module.users', ['ui.router'...]);
var app = angular.module('app.module.users.edit', ['app.modules.users']);
Ваше основное приложение модуля (concat submodules)
angular.module('app', ['ui.bootstrap', 'app.services', 'app.config']
.concat(angular.modules.select('app.module.*')));
Помимо ответа @dfsq вы можете получить список модулей с зависимостями
var AngularModules = (function (angular) {
function AngularModules() {
extendAngularModule();
angular.element(document).ready(function () {
getModulesDependencies();
});
}
var extendAngularModule = function () {
var orig = angular.module;
angular.modules = [];
angular.module = function () {
var args = Array.prototype.slice.call(arguments);
var modules = [];
if (arguments.length > 1) {
modules.push(arguments[0]);
}
for (var i = 0; i < modules.length; i++) {
angular.modules.push({
'module': modules[i]
});
}
return orig.apply(null, args);
};
};
var getModulesDependencies = function () {
for (var i = 0; i < angular.modules.length; i++) {
var module = angular.module(angular.modules[i].module);
angular.modules[i].dependencies = module && module.hasOwnProperty('requires') ? module.requires : [];
}
};
return AngularModules;
})(angular);
Использование:
var modules = new AngularModules();
Есть похожий вопрос с лучшими ответами здесь /questions/36473473/angularjs-poluchit-spisok-vseh-zaregistrirovannyih-uslug/36473480#36473480, краткое изложение того, что они предложили:
var app = angular.module('app', []);
# app.service(/**your injections*/) etc
# to access to the list of services + injections
app._invokeQueue #has following form:
[
[
'$provide',
'service',
Arguments[
'serviceName',
[
'$dependency1',
'$dependency2',
function(){}
],
]
]
]
Это включает в себя изучение деталей реализации, которые могут со временем меняться, но вы можете попробовать это.
- Загрузите страницу полностью.
- Установите точку останова внутри angular.module().
- Вызовите angular.module () из консоли.
- Когда вы нажмете точку останова, выполните распечатку словаря модулей.
console.dir(modules)
или если вы хотите скопировать его в другой редакторwindow.prompt('', JSON.stringify(modules))
Это работает, потому что за кулисами angular создает словарь загруженных модулей, называемых модулями. Вы также хотите дождаться окончания загрузки всех модулей, чтобы они были в словаре.