深入浅析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 相关文章推荐
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
Jun 04 Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 Javascript
使用Javascript简单实现图片无缝滚动
Dec 05 Javascript
jquery背景跟随鼠标滑动导航
Nov 20 Javascript
vue.js框架实现表单排序和分页效果
Aug 09 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
原生JS实现的跳一跳小游戏完整实例
Jan 27 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
基于Node.js搭建hexo博客过程详解
Jun 25 Javascript
jquery 插件重新绑定的处理方法分析
Nov 23 jQuery
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
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查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
php输入数据统一类实例
2015/02/23 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
js函数的延迟加载实现代码
2012/10/11 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
jquery radio的取值_radio的选中_radio的重置方法
2016/09/20 Javascript
js+html制作简单验证码
2017/02/16 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
浅谈Node.js 中间件模式
2018/06/12 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
vue同个按钮控制展开和折叠同个事件操作
2020/07/29 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
python处理cookie详解
2014/02/07 Python
Python实现简单多线程任务队列
2016/02/27 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
中国好声音华少广告词
2014/03/17 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
董事长岗位职责
2015/02/13 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书