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。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]