Angular Ngrx Store 工具库里 Action 定义指南
2023-09-14 09:03:59 时间
Store 文件夹数据结构的一个典型例子:
当您第一次使用 ngrx/store 模块时,必须决定运行应用程序所需的操作。 首先分析从服务器端加载 Heroes 数据的过程并决定应该进行哪些 Action 建模。
- 从服务器端加载所有英雄数据,因此需要一个加载英雄的动作。
- 一个 Effect 启动并从服务器端检索英雄数据。 Effect 还需要通知 Store 我们已经成功地检索到了 Heroes 数据,因此它需要调度一个动作(Load Heroes Success Action)。如果与服务器端的通信失败或出于任何其他原因,Effect 会调度另一个动作(加载英雄失败)进行错误处理。
Ngrx Store 提供的 Action 接口:
export interface Action {
type: string;
}
我们创建一些字符串常量,作为 Action 的标识:
export const LOAD_HEROES = "[Heroes] Load Heroes";
export const LOAD_HEROES_FAIL = "[Heroes] Load Heroes Fail";
export const LOAD_HEROES_SUCCESS = "[Heroes] Load Heroes Success";
其中[]
中括号,代表 Action 的类型-category.
然后我们就有了很多 Action Class:
export class LoadHeroes implements Action {
readonly type = LOAD_HEROES;
}
export class LoadHeroesFail implements Action {
readonly type = LOAD_HEROES_FAIL;
// can pass any error from server-side
constructor(public payload: any) {}
}
export class LoadHeroesSuccess
implements Action {
readonly type = LOAD_HEROES_SUCCESS;
constructor(public payload: fromCore.Hero[])
{}
}
每个动作类都定义了一个类型属性,因为它实现了 Action 接口。 此外,在某些情况下,需要在自定义 Action 类上定义一个可选的有效负载属性,以便调度此操作的代码可以传入一些额外的数据,这些数据稍后会被 Reducer 用来组成新的状态。
LoadHeroesFail 操作类定义了一个有效负载属性来保存与服务器端通信期间抛出的异常的主体。
类似地,LoadHeroesSuccess 动作类定义了一个有效负载属性,来保存从服务器端检索到的实际英雄数据并将其传递给 Reducer.
最后,因为使用 TypeScript 开发 Angular 应用程序,您可以通过定义一个新的 TypeScript 类型(称为 HeroesAction 类型)来添加一些动作类型检查,以保存上面定义的所有动作类。 这样,reducer 只处理在此类型上定义的操作。
export type HeroesAction =
| LoadHeroes
| LoadHeroesFail
| LoadHeroesSuccess;
相关文章
- [Angular CLI] Build application without remove dist folder for Docker Volume
- [Angular] Component's dependency injection
- [Angular] Create a ng-true-value and ng-false-value in Angular by controlValueAccessor
- [Angular Directive] Combine HostBinding with Services in Angular 2 Directives
- [Angular 2] Get start with Firebase
- [Unit testing Angular] Complete component code
- [Angular 8 Unit testing] Testing a smart component with service injection -- 1
- [Angular 2] Pipes with Multiple Parameters
- 关于 Angular SSR 应用在渲染中止时如何避免内存泄漏问题的一些尝试
- 使用 RxJs 实现一个支持 infinite scroll 的 Angular Component
- Angular页面调试一个有用的小技巧 - normalizeDebugBindingName和normalizeDebugBindingValue - [object Object]
- 使用 Angular Universal 进行服务器端渲染的防御性编程思路
- 关于 Angular 开发时对主流浏览器支持的话题
- 关于 Angular PWA 应用中的 ngsw.json 文件
- Angular应用带参数的路由实现