深入浅析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 的addEventListener()及attachEvent()区别分析
May 21 Javascript
JS将秒换成时分秒实现代码
Sep 03 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
Jan 14 Javascript
js创建表单元素并使用submit进行提交
Aug 14 Javascript
js获取滚动距离的方法
May 30 Javascript
表单中单选框添加选项和移除选项
Jul 04 Javascript
微信小程序 radio单选框组件详解及实例代码
Jan 10 Javascript
js实现鼠标左右移动,图片也跟着移动效果
Jan 25 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
Jun 12 Javascript
使用JQ完成表格隔行换色的简单实例
Aug 25 Javascript
js实现自动播放匀速轮播图
Feb 06 Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 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
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
Javascript实现异步编程的过程
2018/06/18 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
python分析nignx访问日志脚本分享
2015/02/26 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python集合是否可变总结
2019/06/20 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
pandas的排序和排名的具体使用
2019/07/31 Python
Python 字符串池化的前提
2020/07/03 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
2014迎新年晚会策划方案
2014/02/23 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
滞留工资返还协议书
2014/10/19 职场文书
2014年商场工作总结
2014/11/22 职场文书
食品安全主题班会
2015/08/13 职场文书
子女赡养老人协议书
2016/03/23 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
python脚本框架webpy模板控制结构
2021/11/20 Python