你的位置:首页 > Java教程

[Java教程]angular源码阅读的起点,setupModuleLoader方法


angular源码其实结构非常清晰,划分的有条有理的,大概就是这样子:

(function(window,document,jquery,undefined){  //一些工具函数 //EXPR 编译器 自执行 //setupModuleLoader方法,公司内部的框架是vxsetup方法,(只是定义,没有调用) //moduler方法() //angular初始化方法,公司内部的框架是vxinit方法 //bootstrap //createInjector  //一系列指令,服务,过滤器等指令})(window,document,window.$)

其实阅读angular源码重要的是angular的整个架构思路,至于服务过滤器和指令可以先抛开。

setupModuleLoader方法写的有点复杂,尤其是直接三层闭包,如果逆着看,容易糊涂,还是顺着思路走比较容易。

首先是,我希望当我运行angualr的时候,可以在window下面创建一个angular属性。这个angualr是一个对象,可以用来创建一个module。于是产生了下面的代码:

function setupModuleLoader(window){        //ensure方法比较通俗易懂,网上也很多解释。由此看来,window.angular这个对象是个单例的。  	var ensure=function(obj,name,factory){		return obj[name]||(obj[name]=factory())	}    	var angular = ensure(window,'angular',Object);         //createModule方法是用来创建一个module实例的。	var createModule = function(name,requires){		var moduleInstance = {			name:name,            requires:requires		};		return moduleInstance;	}    //window.angular.module方法实际运行的是createModule方法,这个闭包只是为了保护一下变量(现在是简化版,变量还没有加)。    //其实要给一个对象增加一个方法,在angular中经常使用ensure函数,传一个工厂函数,这样的好处是整齐并且保护作用域。	ensure(angular,'module',function(){		return function(name,requires){			return createModule(name,requires)		}	})}

  

现在看起来这个angular.module方法就是这样了。这是注册的方法。

众所周知的是,angular.module('myapp',[])这段代码是注册一个module,如果不传后面的第二个参数,就是取回一个app。

然而目前上面写的代码并没有取回一个module的功能。所以需要完善一下:

function setupModuleLoader(window){	var ensure=function(obj,name,factory){		return obj[name]||(obj[name]=factory())	}    //增加一个对象,用于存放每一个注册过的module,其实在angular里面,这个对象也是存在的    //当然,这个modules对象的位置是在下面ensure(angular,'module',fn)的fn工厂函数里,这样放在闭包里就可以杜绝外界访问    //如果你改一下angular的源码,把这个对象强行获取到,比如设置window.modulebox = modules;然后再去打印这个modulebox来看,你会发现所有注册的modules都能看到。    //我放到这里是因为以后方便调试。我可以随时看到modules里面都有什么东西。但是其实不影响的。    var modules={}	var angular = ensure(window,'angular',Object);	var createModule = function(name,requires,modules){		var moduleInstance = {			name:name		};        modules[name]=moduleInstance;//每注册一个module的时候都把这个module按照相应名称存入modules对象。		return moduleInstance;	}	ensure(angular,'module',function(){		return function(name,requires){			if(requires){				return createModule(name,requires,modules)//增加了一个参数,就是modules这个对象。			}else{				return getModule(name,modules);//这个getModule方法虽然还没定义,但是这一段代码看起来确实很明白了。g			}		}	})}

  

现在OK了,可以注册一个module也可以获取一个module了。至于getModules就是根据名称从modules对象中取出一个module,就不写了。

其实简化下来的setupModuleLoader就是这样,挺清晰的。

setupModuleLoader方法真正开始变的复杂是从它与injector的配合开始。

setupModuleLoader方法先放到这儿,下一篇分析一下injector方法。然后回过头来在搞setupModuleLoader。

看看他们是怎么配合的。

重要的是,injector这个东西一定要先理解透彻,同时$provider我希望看到这篇博客的你(当然也包括我)能够理解透彻。

这样的话会很容易搞懂angularJs。

晚安!

 

  




深圳到塞舌尔旅游报价到塞舌尔旅游要多少钱塞舌尔旅游路线塞舌尔旅游多少钱跟团塞舌尔旅游网东莞樱花开到几月?2015东莞樱花结束了吗? 东莞樱花还有开吗?2015东莞樱花开到什么时候? 清远银盏森林温泉和新银盏温泉哪个好?清远银盏森林温泉怎么样? 清远银盏森林温泉和新银盏温泉是一个吗?清远银盏森林温泉和新银盏温泉在哪里? 流溪河森林公园自驾游?流溪河开车路线? 一日赏尽江南秋 细数无锡最美24小时 流溪河森林公园好玩吗?流溪河特色? 流溪河森林公园一天游?流溪河开车需要多长时间? 台山富都猛虎峡勇士漂多少钱?富都猛虎峡勇士漂攻略? 猛虎峡勇士漂流门票包含大巴吗?台山猛虎峡勇士漂流多少钱? 台山猛虎峡勇士漂流几个人一起的?猛虎峡勇士漂流注意事项? 韶关瑶寨好玩吗?韶关必备瑶寨怎么样? 番禺宝墨园好玩吗?广州番禺宝墨园怎样? 你不知道的越南:关于越南的胡扯与真相 番禺宝墨园自助游攻略?广州番禺宝墨园走哪条高速? 番禺宝墨园怎么去?广州番禺宝墨园自驾攻略? ECJ2FB1A475K Datasheet ECJ2FB1A475K Datasheet ECJ2FB1A684K Datasheet ECJ2FB1A684K Datasheet ECJ2FB1C105K Datasheet ECJ2FB1C105K Datasheet 去土耳其旅游多少钱 去土耳其旅游多少钱 去土耳其旅游多少钱 长江图片 长江图片 长江图片 西岛门票 西岛门票 西岛门票