AngularJS中的模块详解


Posted in Javascript onJanuary 29, 2015

在讲angularjs的模块之前,我们先介绍一下angular的一些知识点:

AngularJS是纯客户端技术,完全用Javascript编写的。它使用的是网页开发的常规技术(HTML,CSS,Javascript),目的是让网页应用开发更快更容易。

AngularJS简化应用开发的一个重要方法是,将一个些通用的低级开发操作包装起来提供给开发者。AngularJS会自动处理好这些低级操作。它们包括:

1.DOM操作
2.设置事件的监听
3.输入验证,因为AngularJS会处理大部分这些操作,所以开发者就能更多的专注在应用的业务逻辑上,更少地编写那些重复性的、易错的、低级的代码。

在AngularJS简化开发的同时,它也为客户端带来了一些精巧的技术,它们包括:

1.数据、业务逻辑、视图的分离
2.数据和视图的自动绑定
3.通用服务
4.依赖注入(主要用于聚合服务)
5.可扩展的HTML编译器(完全由JavaScript编写)
6.易于测试
7.客户端对这些技术的需求其实已经存在很久了。

同时,你还可以用AngularJS来开发单页或者多页的应用,不过其主要还是用来开发单页的。 AngularJS支持浏览器的历史操作,向前,向后按钮,单页应用中的收藏操作。

接下来,我们来详细讲解angularJS的模块。

大部分应用都有一个主方法用来实例化、组织、启动应用。AngularJS应用没有主方法,而是使用模块来声明应用应该如何启动。这种方式有以下几个优点:

1.启动过程是声明式的,所以更容易懂。
2.在单元测试是不需要加载全部模块的,因此这种方式有助于写单元测试。
3.可以在特定情况的测试中增加额外的模块,这些模块能更改配置,能帮助进行端对端的测试。
4.第三方代码可以打包成可重用的模块。
5.模块可以以任何先后或者并行的顺序加载(因为模块的执行本身是延迟的)。

举个例子:

<!doctype html>
<html ng-app="myApp">
 <head>
  <script src="http://code.angularjs.org/angular-1.0.2.min.js"></script>
  <script>
      var myAppModule = angular.module('myApp', []);


// configure the module.



// in this example we will create a greeting filter



myAppModule.filter('greet', function() {
 



return function(name) {
  




return 'Hello, ' + name + '!';
 



};



});
  </script>
 </head>
 <body>
  <div>
   {{ 'World' | greet }}
  </div>
 </body>
</html>

上面的例子,我们是通过在<html ng-app="myApp">中进行指定,来实现使用myApp这个模块启动应用的。

以上这个例子写法很简单,但是不适合用同样的写法来写大型应用。我们推荐是将你的应用拆分成以下几个模块:

1.一个服务模块,用来做服务的声明。
2.一个指令模块,用来做指令的声明。
3.一个过滤器模块,用来做过滤器声明。
4.一个依赖以上模块的应用级模块,它包含初始化代码。

举个例子:

<!doctype html>
<html ng-app="xmpl">
 <head>
  <script src="http://code.angularjs.org/angular-1.0.2.min.js"></script>
  <script src="script.js"></script>
 </head>
 <body>
  <div ng-controller="XmplController">
   {{ greeting }}!
  </div>
 </body>
</html>
[/code]

script.js:

[code]
angular.module('xmpl.service', []).   //服务模块
 value('greeter', {    //自定义greeter对象
  salutation: 'Hello',
  localize: function(localization) {
    this.salutation = localization.salutation;
  },
  greet: function(name) {
    return this.salutation + ' ' + name + '!';
  }
 }).
 value('user', {   //自定义user对象
  load: function(name) {
    this.name = name;
  }
 });
angular.module('xmpl.directive', []);  //指令模块
angular.module('xmpl.filter', []);   //过滤器模块
angular.module('xmpl', ['xmpl.service', 'xmpl.directive', 'xmpl.filter']).  //模块xmpl依赖于数组中的模块
 run(function(greeter, user) {
  // 初始化代码,应用启动时,会自动执行
  greeter.localize({
    salutation: 'Bonjour'
  });
  user.load('World');
 })
// A Controller for your app
var XmplController = function($scope, greeter, user) {
   $scope.greeting = greeter.greet(user.name);
}

这样拆分的原因是,在你的测试中常常需要忽略掉初始化代码,因为这些代码比较难测试。通过把它拆分出来就能在测试中方便地忽视掉它。通过只加载和当前测试相关的模块,也能使测试更专一。以上只是一个建议,你可以放心根据你的具体情况来调整。

一个模块就是一系列配置和代码块的集合,它们是在启动阶段就附加到应用上的。一个最简单的模块由两类代码块集合组成的:

配置代码块 - 在注入提供者注入和配置阶段执行。只有注入提供者和常量可以被注入到配置块中。这是为了防止服务在被配置好之前就被提前初始化。
运行代码块 - 在注入器被创建后执行,被用来启动应用的。只有实例和常量能被注入到运行块中。这是为了防止在运行后还出现对系统的配置。

代码实现:

angular.module('myModule', []).  
config(function(injectables) { // provider-injector      配置代码块


// This is an example of config block.


// You can have as many of these as you want.


// You can only inject Providers (not instances)


// into the config blocks.

}). run(function(injectables) { // instance-injector      运行代码块


// This is an example of a run block.


// You can have as many of these as you want.


// You can only inject instances (not Providers)


// into the run blocks

});

模块还有一些配置的简便方法,使用它们的效果等同于使用代码块。举个例子:

angular.module('myModule', []).
 value('a', 123).
 factory('a', function() { return 123; }).
 directive('directiveName', ...).
 filter('filterName', ...);
// is same as
angular.module('myModule', []).
 config(function($provide, $compileProvider, $filterProvider) {
  $provide.value('a', 123)
  $provide.factory('a', function() { return 123; })
  $compileProvider.directive('directiveName', ...).
  $filterProvider.register('filterName', ...);
 });

配置块会按照$provide, $compileProvider, $filterProvider,注册的顺序,依次被应用。唯一的例外是对常量的定义,它们应该始终放在配置块的开始处。

运行块是AngularJS中最像主方法的东西。一个运行块就是一段用来启动应用的代码。它在所有服务都被配置和所有的注入器都被创建后执行。运行块通常包含了一些难以测试的代码,所以它们应该写在单独的模块里,这样在单元测试时就可以忽略它们了。

模块可以把其他模块列为它的依赖。“依赖某个模块”意味着需要把这个被依赖的模块在本块模块之前被加载。换句话说被依赖模块的配置块会在本模块配置块前被执行。运行块也是一样。任何一个模块都只能被加载一次,即使它被多个模块依赖。

模块是一种用来管理$injector配置的方法,和脚本的加载没有关系。现在网上已有很多控制模块加载的库,它们可以和AngularJS配合使用。因为在加载期间模块不做任何事情,所以它们可以以任意顺序或者并行方式加载

Javascript 相关文章推荐
Ajax一统天下之Dojo整合篇
Mar 24 Javascript
jQuery select的操作实现代码
May 06 Javascript
select 控制网页内容隐藏于显示的实现代码
May 25 Javascript
扩展javascript的Date方法实现代码(prototype)
Nov 20 Javascript
JavaScript实现添加、查找、删除元素
Jul 02 Javascript
第四章之BootStrap表单与图片
Apr 25 Javascript
JS文件上传神器bootstrap fileinput详解
Jan 28 Javascript
React实现点击删除列表中对应项
Jan 10 Javascript
node中使用es6/7/8(支持性与性能)
Mar 28 Javascript
react实现antd线上主题动态切换功能
Aug 12 Javascript
利用H5api实现时钟的绘制(javascript)
Sep 13 Javascript
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 Vue.js
jquery结合CSS使用validate实现漂亮的验证
Jan 29 #Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
Jan 29 #Javascript
推荐一个自己用的封装好的javascript插件
Jan 29 #Javascript
js实现点击左右按钮轮播图片效果实例
Jan 29 #Javascript
JavaScript中实现继承的三种方式和实例
Jan 29 #Javascript
javascript面向对象程序设计(一)
Jan 29 #Javascript
jquery调取json数据实现省市级联的方法
Jan 29 #Javascript
You might like
ThinkPHP写第一个模块应用
2012/02/20 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
python版本的读写锁操作方法
2016/04/25 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
用Python实现职工信息管理系统
2020/12/30 Python
请用用Java代码写一个堆栈
2012/01/26 面试题
做人民满意的公务员活动方案
2014/08/25 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
保姆聘用合同
2015/09/21 职场文书
教师培训学习心得体会
2016/01/21 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript