Как динамически зарегистрировать эффект ngrx? - PullRequest
0 голосов
/ 17 апреля 2020

Быстро

Я пытаюсь динамически создать эффект 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.

Все мои "нормально" созданные эффекты работают на отлично.

1 Ответ

0 голосов
/ 17 апреля 2020

На самом деле, я решил ее с помощью подписки на Actions.

Вот код:

@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {

  constructor(
    private _store: Store<STORE_STATE>,
    private _dispatchedActions: Actions
  ) { } 

  process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
    const subscription: Subscription = this._dispatchedActions.subscribe(action => {
      if(action.type == handler.successType || action.type == handler.failureType) {
        handler.processPostAction(<SUCC | FAIL>action);
        subscription.unsubscribe();
      }
    });
    this._store.dispatch(handler.actionToDispatch);
  }
}

Мне все еще интересно, как динамически зарегистрировать @Effect если кто-то знает ответ, хотя!

...