深入浅析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 相关文章推荐
新浪刚打开页面出来的全屏广告代码
Apr 02 Javascript
javascript 可以拖动的DIV(二)
Jun 26 Javascript
各浏览器对click方法的支持差异小结
Jul 31 Javascript
js中的referrer返回上一页使用介绍
Sep 26 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
Sep 02 Javascript
javascript伸缩菜单栏实现代码分享
Nov 12 Javascript
详解JavaScript对象类型
Jun 16 Javascript
Vue.js添加组件操作示例
Jun 13 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
Sep 04 Javascript
LayUi数据表格自定义赋值方式
Oct 26 Javascript
js实现移动端吸顶效果
Jan 08 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
Dec 04 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
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
Django 前后台的数据传递的方法
2017/08/08 Python
numpy数组拼接简单示例
2017/12/15 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
python删除某个目录文件夹的方法
2020/05/26 Python
Python中的__init__作用是什么
2020/06/09 Python
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
大学考试作弊检讨书
2014/01/30 职场文书
车辆转让协议书
2014/04/15 职场文书
兴趣小组活动总结
2014/05/05 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫