依赖注入
依赖注入(DI) 是 Angular 的核心:由框架创建并注入服务(Service)实例,便于测试与解耦。见 Angular 基础。
定义与注入服务
import { Injectable } from "@angular/core";
@Injectable({ providedIn: "root" })
export class UserService {
getUsers() {
return fetch("/api/users").then((r) => r.json());
}
}
import { Component, inject } from "@angular/core";
import { UserService } from "./user.service";
@Component({
selector: "app-user-list",
standalone: true,
template: `...`,
})
export class UserListComponent {
private userService = inject(UserService);
// 或构造函数:constructor(private userService: UserService) {}
}
providedIn: 'root' 表示应用级单例(树摇友好,未使用可不打包)。
提供者作用域
| 配置 | 作用 |
|---|---|
providedIn: 'root' | 全应用单例 |
组件 providers: [MyService] | 每个组件实例一份 |
bootstrapApplication / 路由的 providers | 模块级或路由级 |
子组件注入时,最近的 provider 优先。
函数式提供者
bootstrapApplication(AppComponent, {
providers: [
{ provide: API_URL, useValue: "https://api.example.com" },
{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },
],
});
InjectionToken 用于注入非类类型(字符串、配置对象)。
测试
在单元测试中可用 TestBed.configureTestingModule 覆盖 provider:
TestBed.configureTestingModule({
providers: [{ provide: UserService, useValue: mockUserService }],
});
见 测试。
参考文献
以下链接在编写时均可正常访问:
| 资料 | 说明 |
|---|---|
| 依赖注入 | 官方指南 |
| inject() | 函数式注入 |
| InjectionToken | 令牌 |
相关文章
生态集成
Angular 官方维护路由、HTTP、表单、动画等;UI 与状态扩展由社区与官方 Material 团队提供。涵盖官方/半官方库、常用第三方库、与 Vue/React 生态对照、选型建议与常见坑。
Signal 基础
Signals 是 Angular 16 引入的响应式原语:可读写的 signal、派生的 computed、副作用 effect。用于组件内状态与跨组件细粒度更新,涵盖 API、input signal、与变更检测的关系、最佳实践与常见坑。
RxJS 互操作
Angular 内置 RxJS 处理异步流(HTTP、HttpClient、路由事件、FormControl 的 valueChanges 等)。Signal 适合同步/短链路状态;长生命周期流仍常用 Observable。涵盖 async 管道、toSignal/toObservable、常用操作符、最佳实践与常见坑。
表单
Angular 提供 响应式表单(Reactive Forms) 与 模板驱动表单(Template-driven)。复杂表单推荐 Reactive Forms(模型在 TypeScript 中,易测试)。涵盖 FormGroup/FormArray、Typed Forms、自定义校验器、最佳实践与常见坑。
状态管理
Angular 没有强制单一状态库:服务 + DI、Signal、RxJS 即可覆盖多数场景;大型应用可选用 NgRx。涵盖选型、服务作为状态容器、跨组件共享、NgRx 与 SignalStore、常见坑。
HTTP 与数据
Angular 通过 HttpClient(@angular/common/http)发起 HTTP 请求,返回 RxJS Observable。见 RxJS 互操作、依赖注入。