繁体   English   中英

如何确保角度模块依赖性得到解决?

[英]How can you ensure that angular module dependencies get resolved?

Angular的模块文档( http://docs-angularjs-org-dev.appspot.com/guide/module )说:

依赖

模块可以列出其他模块作为它们的依存关系。 取决于模块意味着需要在加载需求模块之前先加载需求模块。 换句话说,所需模块的配置块在配置块或需求模块之前执行。 运行块也是如此。 每个模块只能加载一次,即使其他多个模块也需要加载一次。

我创建了这个示例( http://jsbin.com/IRogUxA/34/edit ),该示例创建了一个控制器模块,该模块依赖于两个“中级”模块,每个模块都依赖于两个“低级”模块。 因此,我有两个“中级”模块和四个“低级”模块。

显然,在JS源代码中顺序无关紧要。 在上面的示例中,我先定义了高级模块,然后再引用了高级模块。 我知道Angular利用依赖注入来连接依赖关系,但是它的方式对我来说是个谜。

我的问题 :如何确保各个模块的配置块以正确的顺序运行? 或更广泛地说,当以我选择的任何顺序(在JS源代码中)定义它们时,Angular如何解决我的所有依赖关系?

所有的角度模块API方法(例如“ config”,“ factory”等)都包装在“ invokeLater”函数中。 换句话说,当评估依赖模块时,此时并没有真正调用module.config,module.factory等。 而是将这些调用简单地推入队列。

考虑以下示例:

    var demo = angular.module('demo', ['module1']);
demo.config( function( ) {
            console.log("In app.config")
} ).run(function(){
    console.log("Angular run");
});

angular.module("module1", []).factory('myservice', function(){
    return {};
}).controller('mycontroller', function(){} );

对于每个模块,它都有自己的队列:(对于主模块“ demo”)

var invokeQueue = [];
invokeQueue.push("demo.config", xxx);
invokeQueue.push("demo.run", xxx);

对于模块1:

var invokeQueue = [];
invokeQueue.push("module.factory", xxx);
invokeQueue.push("module.controller", xxx);

一旦加载了所有脚本并触发了DOMContentLoaded事件,Angular实际上就会加载/评估所有模块。 此时,角度已经构建了完整的模块依赖树。 依赖模块总是在主模块之前首先被加载,因此在这种情况下,module1将首先被加载,并且它的invokeQueue以原始顺序(module.factory,module.controller等)被调用。 然后回到主模块演示的invokeQueue,demo.config,demo.run

我认为将模块视为自己的应用程序会有所帮助,而不依赖于其他(外部)依赖项的顺序。 如果顺序重要,则可以引入一个模块,该模块可以简单地组成其他模块并协调它们之间的交互。

我们避免在angular.module({moduleName},[deps])调用中使用硬模块引用,而是希望将这些模块由更高级别的模块汇总。 这使得隔离测试变得更加容易,并且您可以以更轻量的方式摆脱依赖的服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM