作者:手机用户2502899267 | 来源:互联网 | 2023-09-18 20:27
原文链接:https:angular-2-training-book.rangle.iohandoutmodulesintroduction.html什么是Angul
原文链接:https://angular-2-training-book.rangle.io/handout/modules/introduction.html
在Angular中,模块是一种用于组合相关联组件,指令,管道和服务的机制,可以与其他模块组合以创建应用程序。 一个Angular应用程序可以被认为是一个拼图,每个部分(或每个模块)能够看到完整的图片。
为了理解,我们可以将Angular模块比作是类。 在一个类中,我们可以定义公共或私有方法。 公共方法是我们代码的其他部分可以使用它与之交互的API,而私有方法是隐藏的实现细节。 同样,模块可以导出或隐藏组件,指令,管道和服务。 导出的元素意图被其他模块使用,而未导出(隐藏)的元素仅在模块本身内部使用,不能被我们应用程序的其他模块直接访问。
模块的基本使用
为了能够定义模块,我们必须使用装饰器 NgModule
.
import { NgModule } from '@angular/core';@NgModule({imports: [ ... ],declarations: [ ... ],bootstrap: [ ... ]
})
export class AppModule { }
在上面的例子中,我们已经通过使用NgModule装饰器将AppModule
类转换为Angular模块。NgModule
装饰器至少需要三个属性:imports
, declarations
和bootstrap
.
属性imports
需要一个模块数组。 这里我们定义了我们的拼图图片(我们的应用程序所需模块)。 属性declarations
需要一个组件,指令和管道数组作为模块的一部分。 bootstrap
属性是我们定义模块的根组件的地方。 即使这个属性也是一个数组,99%的时候我们只定义一个组件。
有些非常特殊的情况,可能需要多个组件来引导模块,但我们不会在这里讨论这些个别情况。
以下是仅由一个组件构成的基本模块,如下所示:
app/app.component.ts
import { Component } from '@angular/core';@Component({selector: 'app-root',template: 'hello world
'
})
export class AppComponent {}
app/app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';import { AppComponent } from './app.component';@NgModule({imports: [BrowserModule],declarations: [AppComponent],bootstrap: [AppComponent]
})
export class AppModule { }
文件app.component.ts只是一个“你好世界”的组件,没有什么特别的。 另一方面,文件app.module.ts遵循我们之前看过的用于定义模块的结构,但在这种情况下,我们正在定义要使用的模块和组件。
我们注意到的第一件事是我们的模块导入BrowserModule
作为显式依赖。BrowserModule
是一个内置的模块,用于导出基本的指令,管道和服务。 与以前的Angular版本不同,我们必须明确导入这些依赖关系,以便在我们的模板中使用*ngFor
或*ngIf
等指令。
鉴于我们模块的根(而且仅有的)组件是AppComponent
,我们必须在 bootstrap
数组中列出它。 因为在declarations
属性中,我们应该定义构成应用程序的所有组件或管道,我们必须再次定义AppComponent
。
在继续之前,有一个重要的澄清要做。 存在两种类型的模块,根模块和功能模块 。
以同样的方式,在一个模块中,我们有一个根组件和许多可能的辅助组件, 在应用程序中,我们只有一个根模块和零个或许多功能模块 。 为了能够引导我们的应用程序,Angular需要知道哪个是根模块。 识别根模块的简单方法是查看其NgModule装饰器的 imports
属性。 如果模块导入BrowserModule
那么它是一个根模块,如果正在导入CommonModule
那么它是一个功能模块。
作为开发人员,我们需要注意在根模块中导入BrowserModule
,而是在为同一应用程序创建的任何其他模块中导入CommonModule
。 如果不这样做,可能会导致在使用延迟加载的模块时遇到问题,我们将在以下部分中看到。
根据惯例,根模块应该始终被命名为AppModule
。
引导应用程序
为了引导我们基于模块的应用程序,我们需要通知Angular哪个是我们的根模块来在浏览器中执行编译。 这个在浏览器中的编译也称为“即时”(JIT)编译。
main.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';platformBrowserDynamic().bootstrapModule(AppModule);
还可以执行编译作为我们工作流的构建步骤。 这种方法称为“Ahead of Time”(AOT)编译,并且将需要稍微不同的引导过程,我们将在另一部分中讨论。
查看示例
在下一节中,我们将看到如何创建具有多个组件,服务和管道的模块。