NGRX - запускать функцию после каждого эффекта - PullRequest
0 голосов
/ 21 сентября 2018

Возможно ли иметь какую-то «функцию обратного вызова» или наблюдателя для эффекта NGRX?Вариант использования: я пытаюсь сохранить состояние при обновлении браузера.Я хотел бы вызвать службу кэширования, чтобы сохранить состояние приложения после запуска каждого эффекта.В настоящее время я делаю это, добавляя это к каждому эффекту:

tap(() => setTimeout(() => this.cacheService.saveAppState()))

Такое ощущение, что должен быть лучший способ сделать это?

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

Я думаю, вам лучше использовать для этого эффекты.

Что вам действительно нужно, так это ловушка, которую нужно предупреждать после каждого обновления магазина.И этим можно управлять с помощью метаредукторов.

Надеюсь, уже есть библиотека, которая обрабатывает все это для вас!

Взгляните сюда https://github.com/btroncone/ngrx-store-localstorage

0 голосов
/ 21 сентября 2018

Да, есть лучший способ.Вы можете реализовать OnRunEffects на классах эффектов.Например:

@Injectable()
export class OrderStoreEffects implements OnRunEffects {
  // Resolves to either QueryCompleted or QueryFailed
  @Effect()
  queryOrdersFromProduct$: Observable<Action> = this.actions$.pipe(...);

  // Resolves to either QueryCompleted or QueryFailed
  @Effect()
  queryOrdersFromWorkCenter$: Observable<Action> = this.actions$.pipe(...);

  constructor(...) {}

  ngrxOnRunEffects(resolvedEffects$: Observable<EffectNotification>) {
    return resolvedEffects$.pipe(tap(effect => console.log({ effect })));
  }
}

Наблюдаемая resolvedEffects$ каждый раз испускает , что эффект в классе OrderStoreEffects выполняется и разрешается.

Вид излучаемых значенийкак это:

enter image description here

Что дает вам дополнительные возможности применения фильтров или другой логики.

Для получения дополнительной информации о OnRunEffects интерфейс, проверьте документы

0 голосов
/ 21 сентября 2018

Вы можете подписаться на ваш эффект, например:

this.store.dispatch(
        new YourActionEffect()
      );

 this.yourEffects.yourfunction.subscribe(
  (
    action:
      | yourActions.action1
      | yourActions.action2
  ) => {
    if (action === YourActionTypes.ACTION1) {
      //when action1 is fire
    }
    else {
      //when action2 is fire
    }
  }
0 голосов
/ 21 сентября 2018

вам не нужно ничего особенного.Напишите отдельный эффект с помощью показанной вами функции и просто не фильтруйте в ней тип действия, а перейдите непосредственно:

this.$actions.pipe(/* your logic here */)

, чтобы он выполнялся для всех действий.

теперь вы можете иметь withLatestFrom, чтобы получить текущее состояние и делать с ним все, что вам нужно.

[ОБНОВЛЕНИЕ]

Это то, что я бы не реализовал в эффектах, но в canDeactivate роутер охранник.

...