Быстро
Я пытаюсь динамически создать эффект ngrx.
Что я пытаюсь выполнить sh:
Я хочу иметь возможность отправлять действия в моем хранилище ngrx, а затем решать, что делать, если действие прошло успешно или не удалось.
Как я это делаю (на данный момент):
В моем магазине 3 действия. LOAD_DOCUMENT
, LOAD_DOCUMENT_SUCCESS
и LOAD_DOCUMENT_FAILURE
. Сейчас я пытаюсь создать Observable
из Actions
, который прослушивает LOAD_DOCUMENT_SUCCESS
и LOAD_DOCUMENT_FAILURE
. Когда любой из них отправляется, он вызывает метод processPostAction()
. Когда Observable будет готов, я вызываю LOAD_DOCUMENT
Действие.
Вот моя реализация:
@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {
actions$: Observable<Action>[] = [];
constructor(
private _store: Store<STORE_STATE>,
private _dispatchedActions: Actions
) { }
process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
const postActionProcessor$: Observable<Action>
= this._dispatchedActions.pipe(
ofType(handler.successType, handler.failureType), // Either LOAD_DOCUMENT_SUCCESS or LOAD_DOCUMENT_FAILURE
tap((action: SUCC | FAIL) => {
handler.processPostAction(action); // method executed after LOAD_DOCUMENT
})
);
this.actions$.push(postActionProcessor$);
this._store.dispatch(handler.actionToDispatch); // call LOAD_DOCUMENT
}
}
Текущее поведение:
В настоящее время:
- вызывается метод
process()
. - Observable создается для эффекта и добавляется в массив.
- Действие
LOAD_DOCUMENT
вызывается и заканчивается LOAD_DOCUMENT_SUCCESS
- Эффект, созданный в методе
process(...)
, никогда не вызывается - Итак, я думаю: эффект не зарегистрирован (как указано здесь )
Мои вопросы:
Как я могу динамически зарегистрировать свой эффект? Есть ли лучший способ получить шаблон, который я пытаюсь реализовать?
Небольшие заметки: Массив действий будет расти и создавать проблемы с памятью. Пока это всего лишь небольшой взлом, чтобы заставить его работать. В идеале я хотел бы зарегистрировать эффект, а не использовать этот массив.
Я также понял, что ключевое слово @Effect
нигде не было размещено. У меня ошибка Decorators are not valid here
при размещении строки 12.
Все мои "нормально" созданные эффекты работают на отлично.