如何确保Angular模块依赖性得到解决



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

依赖项

模块可以将其他模块列为其依赖项。取决于模块意味着需要加载所需的模块在加载要求模块之前。换句话说所需模块的配置块在配置块或要求模块。对于运行块。每个模块只能加载一次,即使多个其他模块需要它。

我创建了此示例(http://jsbin.com/iroguxa/34/Edit),该示例创建了一个依赖于"两个中级"的控制器模块模块,每个模块都取决于两个"低级"模块。因此,我有两个"中层"模块和四个"低级"模块。

显然,在JS源中订单无关紧要。在上面的示例中,我在引用的低级别模块之前定义了高级模块。我知道Angular利用依赖注入来连接依赖关系,但是它的方式对我来说是神秘的。

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

所有角模块API方法(例如" config"," factory"等)都包裹在" InvokeLater"函数中。在另一个单词中,当评估依赖关系模块时,当时并未真正调用模块,模块,即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(){} );

对于每个模块,它都有自己的队列:(用于主模块"演示")

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启动实际上是加载/评估所有模块。此时,Angular已经构建了一个完整的模块依赖树。依赖项模块始终在主模块之前加载,因此在这种情况下,Module1将首先加载,并以原始顺序调用其调用(Module.Factory,Module.Controller等)。然后返回主模块演示的Indokeue,demo.config,demo.run

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

我们避免在angular.module({moduleName},[deps])呼叫中进行硬模块参考,而宁愿让这些模块由更高级别的模块卷起。这使得隔离的测试变得更加容易,并且您可以用更轻的重量来制止您所依赖的服务。

最新更新