AngularJs - 获取所有已注册模块的列表

use*_*862 37 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'])
Run Code Online (Sandbox Code Playgroud)

dfs*_*fsq 44

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);
Run Code Online (Sandbox Code Playgroud)

现在你可以检查angular.modules数组了.

演示:http://plnkr.co/edit/bNUP39cbFqNLbXyRqMex?p=preview


Yac*_*ine 17

你可以简单地做:

console.log(angular.module('ModuleYouWantToInspect').requires);
Run Code Online (Sandbox Code Playgroud)

它应该返回一个字符串数组(依赖项).您可以对输出执行相同的操作.

  • 但是,如果我不知道模块的名称怎么办?OP要求获取所有模块列表的技术(即使OP*确实*知道名称).无论如何,这仍然是一个很好的答案. (7认同)
  • 这应该更高 (3认同)

Ed *_*aub 10

如果您正在调试,我发现您可以通过以下方式获取列表:

查找或添加代码以从任何具有任何正文的模块调用run(),例如:

angular.module('myModule') 
    .run(function() {})
Run Code Online (Sandbox Code Playgroud)

在.run上放置一个断点,然后进入angular.run().在作用域中有一个名为"modules"的对象,它按名称将所有模块作为属性.

这也可以与其他模块方法一起使用,或者可以从代码中访问; 我没有非常努力地理解大图.


小智 6

改善解决方案

(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);
Run Code Online (Sandbox Code Playgroud)

现在您可以选择模块:

angular.modules.select('app.modules.*')
Run Code Online (Sandbox Code Playgroud)

创建模块树:

var app = angular.module('app.module.users', ['ui.router'...]);
var app = angular.module('app.module.users.edit', ['app.modules.users']);
Run Code Online (Sandbox Code Playgroud)

你的主模块应用程序(concat子模块)

angular.module('app', ['ui.bootstrap', 'app.services', 'app.config']
.concat(angular.modules.select('app.module.*')));
Run Code Online (Sandbox Code Playgroud)


7uc*_*uc4 6

给定angular.element,$ injector.modules数组包含已注册模块的列表.

例如

angular.element(document.body).injector().modules
Run Code Online (Sandbox Code Playgroud)