深入浅析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 相关文章推荐
ExtJS 简介 让你知道extjs是什么
Dec 29 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
Mar 10 Javascript
实现点击列表弹出列表索引的两种方式
Mar 08 Javascript
jQuery表格行上移下移和置顶的实现方法
Oct 08 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
Jan 22 Javascript
基于jQuery实现的无刷新表格分页实例
Feb 17 Javascript
jQuery窗口拖动功能的实现代码
Feb 04 Javascript
socket.io学习教程之深入学习篇(三)
Apr 29 Javascript
使用vue + less 实现简单换肤功能的示例
Feb 21 Javascript
js中的 || 与 && 运算符详解
May 24 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 Javascript
Postman如何实现参数化执行及断言处理
Jul 28 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
PHP注释实例技巧
2008/10/03 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
PHP微信分享开发详解
2017/01/14 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
Python代码解决RenderView窗口not found问题
2016/08/28 Python
Python 性能优化技巧总结
2016/11/01 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
生产内勤岗位职责
2013/12/07 职场文书
《中国的气候》教学反思
2014/02/23 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
商铺门面租房协议书
2014/10/21 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
nginx优化的六点方法
2021/03/31 Servers
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技