Ionic 移动开发入门与实战
上QQ阅读APP看书,第一时间看更新

3.3 模块与依赖注入

在图3.4的Angular应用的概要组件图中没有出现模块的字样,然而这不代表它没出现在图里。实际上图中的指令、服务、控制器都是定义在Angular的模块里。读者从图3.6展现的图中可以看到所有类型的Angular组件都是归属于作为容器的某个模块的。

图3.6 Angular模块与组件定义关系

自然地,如果要会使用Angular,就需要解决两个问题:如何在模块里创建组件以及如何使用其他模块里的组件。下文的3.3.1和3.3.2节将分别回答这两个问题。

3.3.1 根模块

Angular或者Ionic新建的项目,都会存在一个根模块,默认名是AppModule。如果你使用了模块化来创建应用,包括AppModule,每个都会存在一个@NgModule装饰器的类(虽然他很像Java中的注解,但是他的官方命名叫装饰器)。我们新建的页面,如果不使用懒加载,都要在@NgModule中先声明后使用。

下面举个例子,简单介绍一下@NgModule中的内容:

     //app.module.ts

import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; @NgModule({ imports: [ BrowserModule ], providers: [ Logger ], declarations: [ AppComponent ], exports: [ AppComponent ], bootstrap: [ AppComponent ] }) export class AppModule { }

• Imports:本模块声明的组件模板需要的类所在的其他模块。

• Providers:服务的创建者,并加入到全局服务列表中,可用于应用任何部分。

• Declarations:声明本模块中拥有的视图类。Angular有三种视图类:组件、指令和管道。

• Exports:declarations的子集,可用于其他模块的组件模板。

• Bootstrap:指定应用的主视图(称为根组件),它是所有其他视图的宿主。只有根模块才能设置bootstrap属性。

3.3.2 使用模块与组件依赖注入

依赖注入是提供类的新实例的一种方式,还负责处理类所需的全部依赖。大多数依赖都是服务。Angular使用依赖注入来提供新组件以及组件所需的服务。

比如我们要给某组件导入HttpService这个服务,看这段代码:

     constructor(private service: HttpService) {
         ...
     }

这个constructor就是构造函数,依赖注入在constructor中进行。你也许会觉得前面写上private、public之类的很怪,这是TypeScript语法比较特殊,习惯就好。

当Angular创建组件时,会首先为组件所需的服务请求一个注入器injector。我们必须先用注入器injector为HttpService注册一个提供商provider。

我们必须在providers写上才能用,看这段代码:

     @Component({
     selector:    'some-list',
     templateUrl: './some-list.component.html',
     providers:  [ HttpService]
     })