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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句