深入浅析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 弹出层注册页面等(asp.net后台)
Jun 17 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
Nov 11 Javascript
javascript文件中引用依赖的js文件的方法
Mar 17 Javascript
jquery删除ID为sNews的tr元素的内容
Apr 10 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
May 05 Javascript
基于jquery实现全屏滚动效果
Nov 26 Javascript
基于javascript实现九九乘法表
Mar 27 Javascript
jQuery基于BootStrap样式实现无限极地区联动
Aug 26 Javascript
jQuery实现checkbox列表的全选、反选功能
Nov 24 Javascript
vue 文件目录结构详解
Nov 24 Javascript
vue几个常用跨域处理方式介绍
Feb 07 Javascript
Vue-cli中为单独页面设置背景色的实现方法
Feb 11 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
IIS6的PHP最佳配置方法
2007/03/19 PHP
PHP 中文处理技巧
2010/04/25 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
php curl操作API接口类完整示例
2019/05/21 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
Angular排序实例详解
2017/06/28 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
在Python中操作字典之clear()方法的使用
2015/05/21 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
python实现从wind导入数据
2019/12/03 Python
python全局变量引用与修改过程解析
2020/01/07 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
七一讲话心得体会
2014/09/05 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
爱护公物主题班会
2015/08/17 职场文书