摘要
Angular 的学习笔记摘要。Angular 是以模块化、组件化的形式来组织应用的,因此,学习过程中需要不断思考 Angular 是如何组织不同的模块。这里需要区分清楚三个概念,模块是负责打包组件/服务的,组件是用来关联页面的,服务是用来封装重用逻辑的。
关键词:Angular 模板 组件 服务
一、什么是 Angular
Angular 是一个用 HTML 和 TypeScript 构建客户端应用的平台与框架。
Angular 支持数据双向绑定、模块化开发、依赖注入这些特性。
二、理解 Angular 的架构
首先 Angular 是以模块化、组件化的形式来组织应用的,因此,学习过程中需要不断思考 Angular 是如何组织不同的模块。
Angular 组件概念表
概念 | 解释 |
---|---|
NgModule | Angular 的基本构造块,为组件提供编译的上下文环境。NgModule 可以将其组件和一组相关代码(如服务)关联起来,形成功能单元。使用 @NgModule 装饰 |
组件 | 每个 Angular 应用都至少有一个组件,即根组件。根组件将组件树和页面的 DOM 连接起来。每个组件关联模板,组件使用服务。使用 @Component 装饰 |
模板 | 模板会把 HTML 和 Angular 的标记(markup)组合起来,这些标记可以在 HTML 元素显示出来之前修改它们。 |
服务 | 服务会提供那些与视图不直接相关的功能,注入到组件中,让组件代码更简洁,及方便组件复用。使用 Injectable 装饰 |
路由 | 路由服务可以定义视图之间的导航路径。 |
小结:这里需要区分清楚三个概念,模块是负责打包组件/服务的,组件是用来关联页面的,服务是用来封装重用逻辑的,后面将会分别介绍模块、组件和服务。
他们之间的关系图如下:
三、理解模块(NgModule)
Angular 应用是模块化的,它拥有自己的模块化系统,称作 NgModule。 一个 NgModule 就是一个容器,用于存放一些内聚的代码块,这些代码块专注于某个应用领域、某个工作流或一组紧密相关的功能。
模块定义例子:
// 引用Angular自带的模块
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
// 引入第三方模块/组件
import { AppComponent } from './app.component';
import { AppService } from './app.service';
import { AppRoutingModule } from './app-routing.module';
// 使用@NgModulw装饰的类为NgModule
@NgModule(...)
export class AppModule {}
1. @NgModule 元数据
@NgModulw 装饰的类为 NgModule,其重要属性如下:
属性 | 描述 |
---|---|
declarations(可声明对象表) | 声明属于本 NgModule 的组件、指令、管道 |
exports(导出表) | 允许其它模块使用的声明对象(组件、指令、管道) |
imports(导入表) | 导入其它模块 |
providers | 本模块向全局服务中贡献的那些服务的创建器。 |
bootstrap | 应用的主视图,只有根模块才能使用该属性。 |
2. NgModule 和组件的关系
NgModule 可以包含任意数量的其它组件,NgModule 为这些组件提供了一个编译上下文环境,这些组件共享同一个编译上下文环境。
四. 理解组件
1. @Component 元数据
@Component 装饰的类为组件,组件告诉 Angular 如何创建和展示这个组件及其视图。具体来说就是,组件把一个模板和该组件关联起来,该组件和模板共同描述一个视图。
视图 = 组件 + 模板
组件的配置选项:
属性 | 描述 |
---|---|
selector | 一个 CSS 选择器,它告诉 Angular 如何找到对应的标签,并往该标签插入视图。 |
templateUrl | 该组件模板对应的 URL 地址 |
providers | 当前组建所需依赖注入的服务(provider)数组 |
2. 关于模板
你需要通过模板来定义视图,视图实际上就是一种 HTML,它告诉 Angular 如何去渲染组件,模板通常以 UI 分区或页面为单位进行修改、显示或隐藏。
五. 理解服务与依赖注入
1. 依赖注入
依赖注入的概念可以参考:Spring:Ioc 和 DI
Angular 将组件和服务(非强制)区分开来,以提高模块性和复用性。
区分原则:
- 服务应该是和视图无关的功能,组件应该是用来绑定数据、作为视图和应用逻辑(服务)的中介者;
- 服务不应该定义任何服务端获取的数据、表单、日志等工作,服务应该是要保证可重用的。
由组件和服务的关系可以看出,组件是服务的消费者,Angular 需要将一个服务注入到组件中以供组件调用。
使用 @Injectable 装饰器来表明一个组件或其它类拥有一个依赖。
2. 如何提供服务
要使用任何服务,必须至少注册一个提供商。
- 默认情况下,CLI 会在 @Injectable 装饰器中注册服务到根注入器,全局可用;
- 如果你使用特定的模块来注册提供商时,则该服务同一个实例可以被该模块下的所有组件使用;
- 如果你使用特定的组件来注册提供商时,则每个新组件实例会使用新的服务实例;
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于