深入浅析AngularJS中的module(模块)


Posted in Javascript onJanuary 04, 2016

什么是AngularJS的模块

我们所说的模块,是你的AngularJS应用程序的一个组成部分,它可以是一个Controller,也可以是一个Service服务,也可以是一个过滤器(Filter),也可以是一个directive(指令)等等…都是属于一个模块!

大多数的应用程序都是有一个自己的函数入口方法Main ,用它来进行初始化,以及加载装配各个模块,然后这些模块的组合,构成了你的应用程序,对吧?

但是,but, AngularJS应用程序却不是这样的哦,它没有main 方法,没有函数入口。代替之的是在模块中指定声明这个模块在AngularJS应用程序中该如何去加载,启动。

这种方法有以下几个优点:

1) 使用声明的方式,让人更加容易理解。

2) 你可以更加容易的让你的代码进行重用。

3) 模块的加载顺序就更加容易控制了。因为这些模块是延迟执行的。

4) 对于进行单元测试就变得更加的方便了。更加可靠,你只需要载入这个模块就可以进行测试了。

5) 端对端的测试中,你可以使用模块去重写配置。

在AngularJS中module是一个核心的存在,包括了很多方面,比如controller, config, service, factory, directive, constant, 等等。

在Javascript中如何实现类似module的功能呢?

或者说,我们定义一个函数,如何把函数内的函数向外界开放呢?

我想,可以把函数中的函数作为一个对象的键值,从而向外界开放。

这样说很笼统,其实是这样的:

var myModule = function outerFuction(){
  var method1 = new function(){}
  var method2 = new function(){}
  return{
    method1: method1,
    method2, method2
  }
}
var o = outerFucntion();
o.method1();
o.mehtod2();

举个银行存钱取钱的例子。

var account = function(){
 //余额
 var balance = 0;
 //存钱
 var deposit = function(money){
  balance+=money;
  console.log("卡上余额为: " + balance);
  notifyUser();
 }
 //取钱
 var withdraw = function(money){
  balance -= money;
  console.log("卡上余额为: " + balance)
  notifyUser();
 }
 //通知用户
 var notifyUser = function(){
  console.log("卡上余额有变动");
 }
 return {
  deposit:deposit,
  withdraw: withdraw
 }
}
var a1 = account();
a1.deposit(100);
a1.withdraw(50);

再来到AngularJS,我们已经习惯了这样写:

var app = angular.module('app',[]);
app.config();
app.controller();
app.factory();
...

也就是获取到module,再调用module提供给我们的方法。

查看angular.js源代码,发现:

angular = window.angular || (window.angular = {} )

这是为什么我们能使用angular这个变量的原因。

...
var moduleInstace = {
    provider: invokeLater('$provide','provider'),
    factory: invokeLater('$provider', 'factory'),
    service: invokeLater('$provider', 'service'),
    value: invokeLater('$provide', 'value'),
    constant: invokeLater('$provider', 'constant'...),
    animation: invokeLater('$animateProvider',...),
    filter: invokeLater('$filterProvider',...),
    controller: invokeLater('$controllerProvider',...),
    directive: invokeLater('$compileProvider',...),
    config: config,
}
return moduleInstance;
...

以上的写法正是module的写法。

PS:angular.module('MyApp',[...])和angular.module('MyApp')之间有一个很小但是却很重要的不同点

        angular.module('MyApp',[...])会创建一个新的Angular模块,然后把方括号([...])中的依赖列表加载进来;而angular.module('MyApp')会使用由第一个调用定义的现有的模块。

        所以,对于以下代码,你需要保证在整个应用中只会使用一次:

angular.module('MyApp', [...]) //如果你的应用是模块化的,这里可能是MyModule

        如果你不打算把模块的引用存到一个变量中,然后在整个应用中通过这个变量来引用模块,那么,在其他文件中使用angular.module(MyApp)的方式可以保证得到正确的AngularJS模块引用。模块上的所有东西都必须通过访问这个模块引用来定义,或者在模块定义的地方把那些必备的内容添加上去。

Javascript 相关文章推荐
取得父标签
Nov 14 Javascript
jquery ready()的几种实现方法小结
Jun 18 Javascript
javascript中的注释使用与注意事项小结
Sep 20 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
Mar 04 Javascript
js实现图片切换(动画版)
Dec 25 Javascript
bootstarp modal框居中显示的实现代码
Feb 18 Javascript
angular bootstrap timepicker TypeError提示怎么办
Jun 13 Javascript
JavaScript解析任意形式的json树型结构展示
Jul 23 Javascript
详解react-router4 异步加载路由两种方法
Sep 12 Javascript
js + css实现标签内容切换功能(实例讲解)
Oct 09 Javascript
Vue实现table上下移动功能示例
Feb 21 Javascript
Vue监听滚动实现锚点定位(双向)示例
Nov 13 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
Jan 04 #Javascript
详解Bootstrap的aria-label和aria-labelledby应用
Jan 04 #Javascript
详解Bootstrap glyphicons字体图标
Jan 04 #Javascript
详解Bootstrap按钮
Jan 04 #Javascript
详解Bootstrap四种图片样式
Jan 04 #Javascript
学习javascript面向对象 理解javascript原型和原型链
Jan 04 #Javascript
详解Bootstrap创建表单的三种格式(一)
Jan 04 #Javascript
You might like
简单采集了yahoo的一些数据
2007/02/14 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
php数组删除元素示例
2014/03/21 PHP
二级域名转向类
2006/11/09 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
python创建临时文件夹的方法
2015/07/06 Python
Python实现的字典值比较功能示例
2018/01/08 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
Python如何合并多个字典或映射
2020/07/24 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
经典c++面试题六
2012/01/18 面试题
文秘专业毕业生就业推荐信
2013/11/08 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
公司拓展活动方案
2014/02/13 职场文书
高中教师评语大全
2014/04/25 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
评先进个人材料
2014/12/29 职场文书
投标承诺函格式
2015/01/21 职场文书
应收账款管理制度
2015/08/06 职场文书
python实现的web监控系统
2021/04/27 Python
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电