angularJS——模块

1、在讲angularjs的模块以前,咱们先介绍一下angular的一些知识点:html

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

 

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

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

 

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

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

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

 

 

2、接下来,咱们来详细讲解angularJS的模块。测试

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

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

 

举个例子:

 1 <!doctype html>
 2 <html ng-app="myApp">
 3 <head>
 4     <script src="http://code.angularjs.org/angular-1.0.2.min.js"></script>
 5     <script>
 6        var myAppModule = angular.module('myApp', []);
 7        // configure the module.
 8        // in this example we will create a greeting filter
 9     myAppModule.filter('greet', function() {
10           return function(name) {
11             return 'Hello, ' + name + '!';
12          };
13    });
14     </script>
15 </head>
16 <body>
17     <div>{{ 'World' | greet }}</div>
18 </body>
19 </html>

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

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

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

 

举个例子:

 1 <!doctype html>
 2 <html ng-app="xmpl">
 3  <head>
 4   <script src="http://code.angularjs.org/angular-1.0.2.min.js"></script>
 5   <script src="script.js"></script>
 6  </head>
 7  <body>
 8   <div ng-controller="XmplController">
 9    {{ greeting }}!
10   </div>
11  </body>
12 </html>
13 [/code]
14  
15 script.js:
16  
17 [code]
18 angular.module('xmpl.service', []).   //服务模块
19  value('greeter', {    //自定义greeter对象
20   salutation: 'Hello',
21   localize: function(localization) {
22     this.salutation = localization.salutation;
23   },
24   greet: function(name) {
25     return this.salutation + ' ' + name + '!';
26   }
27  }).
28  value('user', {   //自定义user对象
29   load: function(name) {
30     this.name = name;
31   }
32  });
33 angular.module('xmpl.directive', []);  //指令模块
34 angular.module('xmpl.filter', []);   //过滤器模块
35 angular.module('xmpl', ['xmpl.service', 'xmpl.directive', 'xmpl.filter']).  //模块xmpl依赖于数组中的模块
36  run(function(greeter, user) {
37   // 初始化代码,应用启动时,会自动执行
38   greeter.localize({
39     salutation: 'Bonjour'
40   });
41   user.load('World');
42  })
43 // A Controller for your app
44 var XmplController = function($scope, greeter, user) {
45    $scope.greeting = greeter.greet(user.name);
46 }

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

 

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

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

代码实现:

 1 angular.module('myModule', []).  
 2   config(function(injectables) { // provider-injector      配置代码块
 3     // This is an example of config block.
 4     // You can have as many of these as you want.
 5     // You can only inject Providers (not instances)
 6     // into the config blocks.
 7   }). run(function(injectables) { // instance-injector      运行代码块
 8     // This is an example of a run block.
 9     // You can have as many of these as you want.
10     // You can only inject instances (not Providers)
11     // into the run blocks
12   });

 

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

 1 angular.module('myModule', []).
 2  value('a', 123).
 3  factory('a', function() { return 123; }).
 4  directive('directiveName', ...).
 5  filter('filterName', ...);
 6 // is same as
 7 angular.module('myModule', []).
 8  config(function($provide, $compileProvider, $filterProvider) {
 9   $provide.value('a', 123)
10   $provide.factory('a', function() { return 123; })
11   $compileProvider.directive('directiveName', ...).
12   $filterProvider.register('filterName', ...);
13  });

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

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

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

模块是一种用来管理$injector配置的方法,和脚本的加载没有关系。如今网上已有不少控制模块加载的库,它们能够和AngularJS配合使用。由于在加载期间模块不作任何事情,因此它们能够以任意顺序或者并行方式加载。

相关文章
相关标签/搜索