angular源码学习第一篇 setupModuleLoader方法


Posted in Javascript onOctober 20, 2016

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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一端时间轮换的广告
Jun 26 Javascript
jquery 应用代码 方便的排序功能
Feb 06 Javascript
扩展JavaScript功能的正确方法(译文)
Apr 12 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
在IE8上JS实现combobox支持拼音检索功能
May 23 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
Aug 01 Javascript
jquery心形点赞关注效果的简单实现
Nov 14 Javascript
js判断iframe中元素是否存在的实现代码
Dec 24 Javascript
vue中的ref和$refs的使用
Nov 22 Javascript
vue项目中使用vue-i18n报错的解决方法
Jan 13 Javascript
bootstrap Table实现合并相同行
Jul 19 Javascript
基于Vue中的父子传值问题解决
Jul 27 Javascript
jQuery动态创建元素以及追加节点的实现方法
Oct 20 #Javascript
JS中动态创建元素的三种方法总结(推荐)
Oct 20 #Javascript
yarn与npm的命令行小结
Oct 20 #Javascript
Bootstrap 网站实例之单页营销网站
Oct 20 #Javascript
Javascript的动态增加类的实现方法
Oct 20 #Javascript
关于RequireJS的简单介绍即使用方法
Oct 20 #Javascript
javascript淘宝主图放大镜功能
Oct 20 #Javascript
You might like
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
python 正则表达式 概述及常用字符
2009/05/04 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
django url到views参数传递的实例
2019/07/19 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
StubHub德国:购买和出售门票
2017/09/06 全球购物
洗煤厂厂长岗位职责
2014/01/03 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
给老婆道歉的话
2015/01/20 职场文书
求职信如何撰写?
2019/05/22 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python
Java界面编程实现界面跳转
2022/06/16 Java/Android