深入浅析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 相关文章推荐
jquery网页回到顶部效果(图标渐隐,自写)
Jun 16 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
Mar 17 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
May 28 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
Javascript中字符串和数字的操作方法整理
Jan 22 Javascript
JavaScript for循环 if判断语句(学习笔记)
Oct 11 Javascript
解决JS表单验证只有第一个IF起作用的问题
Dec 04 Javascript
webpack中如何加载静态文件的方法步骤
May 18 Javascript
JS实现商品橱窗特效
Jan 09 Javascript
基于javascript实现移动端轮播图效果
Dec 21 Javascript
Node实现搜索框进行模糊查询
Jun 28 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
PHP开发中的错误收集,不定期更新。
2011/02/03 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
JavaScript使用cookie
2007/02/02 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
Python中的下划线详解
2015/06/24 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
Python中的__slots__示例详解
2017/07/06 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
Python小进度条显示代码
2019/03/05 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
如何查找网页漏洞
2016/06/22 面试题
求职信内容考虑哪几点
2013/10/05 职场文书
就业自我评价
2014/02/04 职场文书
签约仪式主持词
2014/03/19 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
教师素质教育心得体会
2016/01/19 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS