Для правильной архитектуры экшена NGRX с двумя логическими шагами, вам понадобятся два отдельных экшена и один эффект. Ниже приведена детальная инструкция по архитектуре экшена с двумя логическими шагами.
Шаг 1: Создание первого экшена
- Создайте новый файл с именем
first-action.ts
. - В файле
first-action.ts
создайте константу для типа действия, напримерexport const FIRST_ACTION = '[Feature] First Action'
. - Создайте класс для первого экшена, который будет содержать свойство
readonly type
, инициализированное значением константыFIRST_ACTION
, и необязательные свойства для передачи данных. Например:
export class FirstAction implements Action { readonly type = FIRST_ACTION; constructor(public payload?: any) {} }
Шаг 2: Создание второго экшена
- Создайте новый файл с именем
second-action.ts
. - В файле
second-action.ts
создайте константу для типа действия, напримерexport const SECOND_ACTION = '[Feature] Second Action'
. - Создайте класс для второго экшена, который будет содержать свойство
readonly type
, инициализированное значением константыSECOND_ACTION
, и необязательные свойства для передачи данных. Например:
export class SecondAction implements Action { readonly type = SECOND_ACTION; constructor(public payload?: any) {} }
Шаг 3: Создание эффекта
- Создайте новый файл с именем
your-effect.ts
. - В файле
your-effect.ts
импортируйте необходимые классы и операторы из@ngrx/effects
и файлы с экшенами. - Создайте класс для эффекта, который будет содержать инжектированный сервис, а также свойства
firstAction$
иsecondAction$
с помощью оператораofType
, а затем определите логику для обработки каждого экшена. Например:
import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { mergeMap, map } from 'rxjs/operators'; import { YourService } from './your-service'; import { FIRST_ACTION, SecondAction } from './your-actions'; @Injectable() export class YourEffect { constructor(private actions$: Actions, private yourService: YourService) {} @Effect() firstAction$ = this.actions$.pipe( ofType(FIRST_ACTION), mergeMap(() => this.yourService.doSomething().pipe( map(response => new SecondAction(response)) )) ); }
Шаг 4: Зарегистрируйте эффект в вашем модуле
- Откройте файл вашего модуля, в котором вы будете использовать эффект.
- Импортируйте необходимые классы и провайдеры из
@ngrx/effects
. - В разделе
providers
вашего модуля добавьте провайдер для классаYourEffect
. Например:
import { EffectsModule } from '@ngrx/effects'; import { YourEffect } from './your-effect'; @NgModule({ imports: [ ..., EffectsModule.forRoot([YourEffect]) ], providers: [...], // добавьте ваш эффект в список провайдеров ... }) export class YourModule { }
Теперь вы можете использовать эти экшены в ваших редюсерах и диспатчить их из ваших компонентов или сервисов с помощью store.dispatch()
.