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 相关文章推荐
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
基于jquery实现发送文章到手机的代码
Dec 26 Javascript
javascript电商网站抢购倒计时效果实现
Nov 19 Javascript
JQuery对ASP.NET MVC数据进行更新删除
Jul 13 Javascript
javascript history对象详解
Feb 09 Javascript
详解vue-cli 脚手架项目-package.json
Jul 04 Javascript
详解A标签中href=""的几种用法
Aug 20 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
Jun 20 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
Jul 26 Javascript
详解vue-cli 脚手架 安装
Apr 16 Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 Javascript
react ant Design手动设置表单的值操作
Oct 31 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操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
python文字转语音的实例代码分析
2019/11/12 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
英国团购网站:Groupon英国
2017/11/28 全球购物
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
直接有效的自我评价
2014/01/11 职场文书
业务员的岗位职责
2014/03/15 职场文书
见习报告格式要求
2014/11/04 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
拙作再改《我的收音机情缘》
2022/04/05 无线电
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL