深入浅析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 相关文章推荐
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
JS自动适应的图片弹窗实例
Jun 29 Javascript
调用HttpHanlder的几种返回方式小结
Dec 20 Javascript
jquery检测input checked 控件是否被选中的方法
Mar 26 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
Jan 28 Javascript
javascript中基本类型和引用类型的区别分析
May 12 Javascript
js兼容火狐显示上传图片预览效果的方法
May 21 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
Feb 21 Javascript
vue实现简单的日历效果
Sep 24 Javascript
webpack3.0升级4.0的方法步骤
Apr 02 Javascript
JavaScript cookie原理及使用实例
May 08 Javascript
JavaScript数组排序功能简单实现
May 14 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获取301跳转URL简单实例
2013/12/16 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
javascript函数库-集合框架
2007/04/27 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
快速入手Python字符编码
2016/08/03 Python
Python模拟三级菜单效果
2017/09/11 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
体育教育毕业生自荐信
2013/11/21 职场文书
总经理秘书工作职责
2013/12/26 职场文书
美发店5.1活动方案
2014/01/24 职场文书
趣味比赛活动方案
2014/02/15 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
机械操作工岗位职责
2014/08/08 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
放飞理想演讲稿
2014/09/09 职场文书
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏