深入浅析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 相关文章推荐
改版了网上的一个js操作userdata
Apr 27 Javascript
你可能不知道的JavaScript的new Function()方法
Apr 17 Javascript
Javascript正则控制文本框只能输入整数或浮点数
Sep 02 Javascript
javascript中通过arguments参数伪装方法重载
Oct 08 Javascript
jquery实现上下左右滑动的方法
Feb 09 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
Dec 12 Javascript
Vue.js双向绑定实现原理详解
Dec 22 Javascript
巧用canvas
Jan 21 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
Nov 26 Javascript
JS 实现微信扫一扫功能
Sep 14 Javascript
puppeteer实现html截图的示例代码
Jan 10 Javascript
javascript使用substring实现的展开与收缩文字功能示例
Jun 17 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
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
微信小程序webview实现长按点击识别二维码功能示例
2019/01/24 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
python实现文件的备份流程详解
2019/06/18 Python
python实现飞船大战
2020/04/24 Python
深入理解Python 多线程
2020/06/16 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
高三政治教学反思
2014/02/06 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
Python面向对象编程之类的概念
2021/11/01 Python