Angular模块

我们一直在说Angular应用是由组件树组成,但是随着项目越来越大,组件也会成百上千,如何更好管理这些组件,那就是 Angular 模块的职责。

将某个业务相关的组件放在一起,允许限定某些组件给别的业务用,让整体业务显得更加内聚

Angular只有一个 @NgModule() 装饰器来描述,所以你非常容易学习它。

一、什么是 @NgModule()

interface NgModule {
    imports: [],
    declarations: [],
    providers: [],
    exports: [],
    entryComponents: [],
    bootstrap: [],
    schemas: [],
    id: string;
}

imports

导入别人的组件,比如Angular提供的 Http 网络请求相关的,那么就需要导入:HttpModule,或者可能是当前应用的某个模块。

declarations

所有组件都必须先定义后使用,这是因为依赖注入的关系。

providers

declarations 很像,但它是定义带有 @Injectable() 装假器的服务类,并且它是单例模式(即始终只会被实例一次)。

exports

如果觉得当前模块的某个组件或服务要给另一个模块用的,那就导出它。

entryComponents

当某个组件未在某处模板中调用到时,AOT 会抛弃它。但,有时候某些组件是由动态创建的,比如模态框。所以,为了告诉 AOT 说,这个组件也会用到。

bootstrap

设定根组件。

schemas

声明非Angular的组件或者指令的元素或属性时如何处理,有两种情况:

  • NO_ERRORS_SCHEMA 允许任意元素或属性(例如:<a-asdf></a-asdf> 有效、<aasdf></aasdf> 有效),这个设置给组件写单元测试时还蛮有用的。
  • CUSTOM_ELEMENTS_SCHEMA 允许任何带有 - (例如:<a-asdf></a-asdf> 有效、<aasdf></aasdf> 无效) 的元素或属性。

id

用来区分模块唯一值,如果指定 undefined 时模块将不会被注册。默认无须指定,Angular Cli会统一帮我们处理。

二、启动根模块

从树的概念来讲,需要指定一个根模块。所有的一切都由这个根模块逐一向下伸展。

你可以 src/main.ts 看到这一句启用根模块的代码:

platformBrowserDynamic().bootstrapModule(AppModule);

results matching ""

    No results matching ""