Angular关于模块的文档(http://docs-angularjs-org-dev.appspot.com/guide/module)说:
依赖关系
模块可以将其他模块列为其依赖项。 根据模块的不同,需要加载所需的模块 在加载需求模块之前。换句话说 所需模块的配置块在执行之前执行 配置块或需求模块。这同样适用于 跑块。每个模块只能加载一次,即使是多个也是如此 其他模块需要它。
我创建了这个示例(http://jsbin.com/IRogUxA/34/edit),它创建了一个依赖于两个“中级”模块的控制器模块,每个模块依赖于两个“低级”模块。所以,我有两个“中级”模块和四个“低级”模块。
显然,JS源代码中的顺序无关紧要。在上面的例子中,我在他们引用的低级模块之前定义了高级模块。我理解Angular使用依赖注入来连接依赖项,但它这样做的方式对我来说是神秘的。
我的问题:如何确保各个模块的配置块以正确的顺序运行?或者更广泛地说,当Angular以我选择的任何顺序(在JS源代码中)定义时,它如何解析所有依赖项?
答案 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])
调用中使用硬模块引用,而是希望通过更高级别的模块汇总这些引用。这样可以更容易地在隔离区进行测试,并且可以通过更轻的重量来限制您所依赖的服务。