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

时间:2014-01-27 15:51:13

标签: javascript angularjs dependency-injection module

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

  

依赖关系

     

模块可以将其他模块列为其依赖项。   根据模块的不同,需要加载所需的模块   在加载需求模块之前。换句话说   所需模块的配置块在执行之前执行   配置块或需求模块。这同样适用于   跑块。每个模块只能加载一次,即使是多个也是如此   其他模块需要它。

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

显然,JS源代码中的顺序无关紧要。在上面的例子中,我在他们引用的低级模块之前定义了高级模块。我理解Angular使用依赖注入来连接依赖项,但它这样做的方式对我来说是神秘的。

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

2 个答案:

答案 0 :(得分:2)

所有角度模块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);

对于module1:

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

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

答案 1 :(得分:1)

我认为将模块视为自己的应用程序是有帮助的,而不是依赖于其他(外部)依赖项的排序。 如果订单 很重要,那么您可以引入一个简单组成其他模块并协调其交互的模块。

我们避免在我们的angular.module({moduleName},[deps])调用中使用硬模块引用,而是希望通过更高级别的模块汇总这些引用。这样可以更容易地在隔离区进行测试,并且可以通过更轻的重量来限制您所依赖的服务。