Angular文档-架构概览
二、架构概览
Angular 是一个用 HTML 和 TypeScript 构建客户端应用的平台与框架。
2.1 NgModule简介
Angular 的基本构造块是 NgModule,它为组件提供了编译的上下文环境。NgModule可以将其组件和一组相关代码(如服务)关联起来
每个Angular应用都有一个根模块,通常命名AppModule
.根模块提供了用来启动应用的引导机制。
NgModule 是一个带有 @``NgModule
装饰器的类,@``NgModule
装饰器是一个函数,它接受一个元数据对象
- declarations(可声明对象表) -- 声明某些的组件、指令、管道属于这个模块
- exports(导出表) -- 公开其中部分组件、指令和管道,以便其他模块中的组件模板中可以使用
- imports(导入表)-- 所需的其他模块
- providers -- 全局服务中贡献的那些服务的创建器
- bootstrap -- 应用的主视图,称为根组件
NgModules 用于配置注入器和编译器,并帮你把那些相关的东西组织在一起。
2.2 常用的NgModule
NgModule | 导入自 | 为何用它 |
---|---|---|
BrowserModule |
@angular/platform-browser | 当你要在浏览器中运行应用时,支持简化安全性和事件处理的服务,并允许应用程序访问浏览器专有的功能,例如解释键盘输入和控制文档要显示的标题。浏览器中运行的所有应用程序都使用同一个平台服务。 |
CommonModule |
@angular/common | 当你要使用 NgIf和NgFor时 |
FormsModule |
@angular/forms | 当你要构建模板驱动表单时(它包含 NgModel) |
ReactiveFormsModule |
@angular/forms | 当你要构建响应式表单时 |
RouterModule |
@angular/router | 当你要通过 HTTP 协议和服务器对话时 |
2.3 特性模块
用户工作流、路由和表单等一些聚焦的功能区
特性模块导入CommonModule
,而不是BrowerModule
,后者只应该在根模块中导入一次。[CommonModule](https://angular.cn/api/common/CommonModule)
只包含常用指令的信息,比如 [ngIf](https://angular.cn/api/common/NgIf)
和 [ngFor](https://angular.cn/api/common/NgForOf)
,它们在大多数模板中都要用到,而 [BrowserModule](https://angular.cn/api/platform-browser/BrowserModule)
为浏览器所做的应用配置只会使用一次。
2.3 入口组件
入口组件是 Angular 命令式加载的任意组件。
入口组件有两种主要的类型:
引导用的根组件。
在路由定义中指定的组件。
所有路由组件都必须是入口组件。需要把同一个组件添加到两个地方(路由和entryComponents
中)
entryComponents数组被用来告诉编译器哪些组件会被动态创建和插入。
2.4 共享NgModule
ShareModule
2.5 单例服务
在 Angular 中有两种方式来生成单例服务:
把
@Injectable()
中的providedIn
属性设置为"root"
。把该服务包含在
AppModule
或某个只会被AppModule
导入的模块中。
forRoot() 模式
通常,你只需要用 providedIn
提供服务,用 forRoot()
/forChild()
提供路由即可。
如果模块同时定义了 providers(服务)和 declarations(组件、指令、管道),那么,当你同时在多个特性模块中加载此模块时,这些服务就会被注册在多个地方。这会导致出现多个服务实例,并且该服务的行为不再像单例一样。
有多种方式来防止这种现象:
用provideIn语法代替在模块中注册服务的方式
把你服务分离到他们自己的模块中
在模块分别定义forRoot() 和 forChild()方法