深入浅析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 相关文章推荐
随机显示经典句子或诗歌的javascript脚本
Aug 04 Javascript
javascript[js]获取url参数的代码
Oct 17 Javascript
javascript实现仿银行密码输入框效果的代码
Dec 13 Javascript
JQuery验证工具类搜集整理
Jan 16 Javascript
javascript 兼容各个浏览器的事件
Feb 04 Javascript
jQuery的几个我们必须了解的特点
May 03 Javascript
JavaScript实现算术平方根算法-代码超简单
Sep 11 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
Feb 25 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
Feb 20 Javascript
Bootstrap面板(Panels)的简单实现代码
Mar 17 Javascript
微信小程序 同步请求授权的详解
Aug 04 Javascript
js实现移动端图片滑块验证功能
Sep 29 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正则走开
2008/03/15 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python中optparse模块使用浅析
2015/01/01 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
python操作excel让工作自动化
2019/08/09 Python
python实现低通滤波器代码
2020/02/26 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
python全栈开发语法总结
2020/11/22 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
仓库管理专业个人自我评价范文
2013/11/11 职场文书
人事档案接收函
2014/01/12 职场文书
法律进企业活动方案
2014/03/04 职场文书
报告会主持词
2014/04/02 职场文书
高中学生期末评语
2014/04/25 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js