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 相关文章推荐
地震发生中逃生十大法则
May 12 Javascript
JavaScript 设计模式学习 Factory
Jul 29 Javascript
jquery ajax abort()的使用方法
Oct 28 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
Vue实例中生命周期created和mounted的区别详解
Aug 25 Javascript
基于Cookie常用操作以及属性介绍
Sep 07 Javascript
Vue结合SignalR实现前后端实时消息同步
Sep 19 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
Sep 26 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 Javascript
vue 中的keep-alive实例代码
Jul 20 Javascript
更强大的vue ssr实现预取数据的方式
Jul 19 Javascript
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
PHP,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
浅析Python中signal包的使用
2015/11/13 Python
python利用微信公众号实现报警功能
2018/06/10 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
Flask框架web开发之零基础入门
2018/12/10 Python
python打开windows应用程序的实例
2019/06/28 Python
opencv python如何实现图像二值化
2020/02/03 Python
垃圾回收的优点和原理
2014/05/16 面试题
保密普查工作实施方案
2014/02/25 职场文书
个人贷款担保书
2014/04/01 职场文书
小学家长评语大全
2014/04/16 职场文书
公司慰问信范文
2015/03/23 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python