`

AngularJS Module类的方法

阅读更多

        AngularJS中的Module类负责定义应用如何启动,它还可以通过声明的方式定义应用中的各个片段。我们来看看它是如何实现这些功能的。

一.Main方法在哪里

        如果你是从Java或者Python编程语言转过来的,那么你可能很想知道AngularJS里面的main方法在哪里?这个把所有东西启动起来,并且第一个被执行的方法在哪里?JavaScript代码里面负责实例化并且把所有东西组合到一起,然后命令应用开始运行的那个方法在哪里?

        事实上,AngularJS并没有main方法,AngularJS使用模块的概念来代替main方法。模块允许我们通过声明的方式来描述应用中的依赖关系,以及如何进行组装和启动。使用这种方式的原因如下:

        1.模块是声明式的。这就意味着它编写起来更加容易,同时理解起来也很容易,阅读它就像读普通的英文一样!

        2.它是模块化的。这就迫使你去思考如何定义你的组件和依赖关系,让它们变得更加清晰。

        3.它让测试更加容易。在单元测试吕,你可以有选择地加入模块,并且可以避免代码中存在无法进行单元测试的内容。同时,在场景测试中,你可以加载其他额外的模块,这样就可以更好地和其他组件配合使用。

        例如,在我们的应用中有一个叫做"MyAwesomeApp"的模块。在HTML里面,只要把以下内容添加到<html>标签中(或者从技术上说,可以添加到任何标签中):

<html ng-app="MyAwesomeApp">

        ng-app指令就会告诉AngularJS使用MyAwesomeApp模块来启动你的应用。那么,应该如何定义模块呢?举例来说,我们建议你为服务、指令和过滤器分别定义不同的模块。然后你的主模块可以声明依赖这些模块。

        这样可以使得模块管理更加容易,因为它们都是良好的、完备的代码块,每个模块有且只有一种职能。同时,单元测试可以只加载它们所关注的模块,这样就可以减少初始化的次数,单元测试也会变得更精致、更专注。

二.加载和依赖

        模块加载动作发生在两个不同的阶段,这一点从函数名上面就可以反映出来,它们分别是Config代码块和Run代码块(或者叫做阶段)。

1.Config代码块

        在这一阶段里面,AngularJS会连接并注册好所有数据源。因此,只有数据源和常量可以注入到Config代码块中。那些不确定是否已经初始化好的服务不能注入进来。

2.Run代码块

        Run代码块用来启动你的应用,并且在注射器创建完成之后开始执行。为了避免在这一点开始之后再对系统进行配置操作,只有实例和常量可以被注入到Run代码块中。你会发现,在AngularJS中,Run代码块是与main方法最类似的东西。

三.快捷方法

        利用模块可以做什么呢?我们可以用它来实例化控制器、指令、过滤器以及服务,但是利用模块类还可以做更多事情。如下模块配置的API方法:

1.config(configFn)

        利用此方法可以做一些注册工作,这些工作需要在模块加载时完成。

2.constant(name, object)

        此方法会首先运行,所以你可以用它来声明整个应用范围内的常量,并且让它们在所有配置(config方法)和实例(后面的所有方法,例如controller、service等)方法中可用。

3.controller(name,constructor)

        它的基本作用是配置好控制器方便后面使用。

4.directive(name,directiveFactory)

        可以使用此方法在应用中创建指令。

5.filter(name,filterFactory)

        允许你创建命名的AngularJS过滤器,就像前面章节所讨论的那样。

6.run(initializationFn)

        如果你想要在注射器启动之后执行某些操作,而这些操作需要在页面对用户可用之前执行,就可以使用此方法。

7.value(name,object)

        允许在整个应用中注射值。

8.factory(name,factoryFn)

        如果你有一个类或者对象,需要首先为它提供一些逻辑或者参数,然后才能对它初始化,那么你就可以使用这里的factory接口。factory是一个函数,它负责创建一些特定的值(或者对象)。我们来看一个greeter(打招呼)函数的实例,这个函数需要一条问候语来初始化:

function Greeter(salutation) {
   this.greet = function(name) {
       return salutation + ' ' + name;
   };
}

        greeter函数示例如下:

myApp.factory('greeter', function(salut) {
    return new Greeter(salut);
});

        然后可以这样来调用它:

var myGreeter = greeter('Halo');

9.service(name,object)

        factory和service之间的不同点在于,factory会直接调用传递给它的函数,然后返回执行的结果;而service将会使用"new"关键字来调用传递给它的构造方法,然后再返回结果。所以,前面的greeter Factory可以替换成下面这个greeter Service:

myApp.service('greeter', Greeter);

        每当我们需要一个greeter实例的时候,AngularJS就会调用新的Greeter()来返回一个实例。

10.provider(name,providerFn)

        provider是这几个方法中最复杂的部分(显然,也是可配置性最好的部分)。provider中既绑定了factory也绑定了service,并且在注入系统准备完毕之前,还可以享受到配置provider函数的好处(也就是config块)。

        我们来看看使用provider改造之后的greeter Service是什么样子:

myApp.provider('greeter', function() {
    var salutation = 'Hello';
    this.setSalutation = function(s) {
        salutation = s;
    }
    
    function Greeter(a) {
        this.greet = function() {
            return salutation + ' ' + a;
        }
     }
    
     this.$get = function(a) {
          return new Greeter(a);
     };
});

        这样我们就可以在运行时动态设置问候语了(例如,可以根据用户使用的不同语言进行设置)。

var myApp = angular.module(myApp, []).config(function(greeterProvider) {
     greeterProvider.setSalutation('Namaste');
});

        每当有人需要一个greeter实例时,AngularJS就会在内部调用$get方法。

 

附:angular.module('MyApp',[...])和angular.module('MyApp')之间有一个很小但是却很重要的不同点

        angular.module('MyApp',[...])会创建一个新的Angular模块,然后把方括号([...])中的依赖列表加载进来;而angular.module('MyApp')会使用由第一个调用定义的现有的模块。

        所以,对于以下代码,你需要保证在整个应用中只会使用一次:

angular.module('MyApp', [...])   //如果你的应用是模块化的,这里可能是MyModule

        如果你不打算把模块的引用存到一个变量中,然后在整个应用中通过这个变量来引用模块,那么,在其他文件中使用angular.module(MyApp)的方式可以保证得到正确的AngularJS模块引用。模块上的所有东西都必须通过访问这个模块引用来定义,或者在模块定义的地方把那些必备的内容添加上去。

分享到:
评论

相关推荐

    浅谈angularjs module返回对象的坑(推荐)

    在AngularJS中,创建模块的标准方法是使用angular.module方法,这允许开发者按照所需的功能将代码分割到不同的文件中。当开发者使用angular.module创建一个模块时,需要提供两个参数:模块的名称和依赖的模块列表。 ...

    ng-image-appear, AngularJS MODULE 用于使图像在加载时具有过渡效果.zip

    ng-image-appear, AngularJS MODULE 用于使图像在加载时具有过渡效果 ng-image-appear AngularJS MODULE 用于使图像在加载时具有过渡效果。包装包装器中的img 标记并在。 没有更丑陋的逐渐加载图像 !...

    AngularJS Module方法详解

    总之,AngularJS的Module方法是其核心架构的一部分,它提供了模块化、声明式的方式来组织和启动应用,同时简化了测试和维护。通过理解并熟练掌握Module方法,开发者能够更有效地构建和管理复杂的AngularJS项目。

    AngularJS API常用方法示例

    **AngularJS API常用方法示例** AngularJS,作为一款强大的前端JavaScript框架,为开发者提供了丰富的API,用于构建交互式、动态的Web应用。本篇将详细介绍一些AngularJS API的常用方法,帮助你更好地理解和运用这...

    angularjs_angularjs_

    var app = angular.module('myApp', ['ngRoute']); app.config(function($routeProvider) { $routeProvider .when('/', { templateUrl: 'home.html', controller: 'HomeController' }) .when('/about', { ...

    Learning AngularJS.pdf (0分下载网)

    - **创建**:通过`module.controller()`方法来定义一个控制器。 - **作用域**:每个控制器都有自己的作用域,可以在其中定义属性和方法。 #### 视图(View) - **定义**:视图是用户界面的一部分,通常是由HTML标记...

    JS AngularJS 学习笔记

    使用`angular.module()`方法可以创建和注册新模块。 **6. 表单验证** AngularJS提供了内置的表单验证机制,可以方便地对用户输入进行实时验证。通过`ngModel`和`ngMessages`指令,我们可以轻松地显示错误消息,...

    angularjs-viewhead, 在每个视图中,更改HTML标题和标题元素.zip

    angularjs-viewhead, 在每个视图中,更改HTML标题和标题元素 angularjs-viewhead一个 AngularJS MODULE,允许视图设置页面标题并将额外元素插入到标题中。动机在正常使用中,angularjs的路由器允许选定视图影响页面...

    AngularJs 1.5.8

    1. **模块化**:AngularJS的核心概念之一就是模块(Module),它允许开发者将应用的不同部分组织成独立的模块,方便管理和重用。在1.5.8版本中,模块机制更加成熟,能够更好地支持依赖注入和服务注册。 2. **组件化...

    AngularJS 中文API参考手册

    2. 模块(Module):模块是AngularJS应用的基础,它用来组织应用的组件,如控制器、服务、指令等。 3. 控制器(Controller):控制器是MVC模式中的C部分,负责处理业务逻辑和视图之间的交互。 4. 路由(Routing):...

    angularjs_requirejs demo

    2. **定义模块**:然后,使用RequireJS的define方法定义AngularJS的模块。每个模块文件都应该声明其依赖,这包括其他AngularJS模块和服务。 3. **注入服务**:在AngularJS中,我们通常会创建服务并注入到控制器或...

    AngularJS1.x快速入门

    - **模块**:用于组织和管理代码结构,如使用 `angular.module()` 创建和配置模块。 #### 三、快速上手 - **入门程序1**:实现一个实时记录用户键盘输入内容的功能。 - **传统方法**:通过监听键盘事件并手动更新...

    angularJS理论与实战.ppt

    4. 模块化:通过angular.module()方法创建模块,模块可以包含控制器、服务、指令等组件。 5. 服务注入:在控制器或其他服务中,通过依赖注入获取所需的服务实例。 三、AngularJS实战 1. 基础模板:创建一个简单的...

    AngularJs学习笔记.docx

    3. **定义控制器**:使用 `module.controller()` 方法定义一个控制器,并将其关联到模块上。 4. **关联视图**:在 HTML 中添加 ng-app 属性指定模块名称,ng-controller 属性指定控制器名称。 ##### 2.3 创建简单的...

    AngularJS+ NodeJS

    2. **模块化**:使用CommonJS规范,通过require和module.exports实现模块导入导出。 3. **npm包管理器**:拥有庞大的第三方库生态系统,加速开发进程。 4. **Express框架**:常用Node.js Web应用框架,简化路由和...

    AngularJS学习手册 源代码

    模块通过`angular.module()`方法创建,并可以通过`.config()`和`.run()`方法配置和初始化。例如: ```javascript var myApp = angular.module('myApp', []); myApp.config(function($routeProvider) { // 配置路由...

    AngularJS开发下一代WEB应用

    开发者可以通过angular.module方法来创建和配置模块。 AngularJS中的双向数据绑定是其一大亮点,它允许开发者仅通过HTML标记和JavaScript代码就创建动态的web页面。这种数据绑定减少了大量样板代码,并且使得视图层...

Global site tag (gtag.js) - Google Analytics