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 создает словарь загруженных модулей, называемых модулями. Вы также хотите дождаться окончания загрузки всех модулей, чтобы они были в словаре.

Другие вопросы по тегам