在redux生命周期中我应该调用方法来显示通知(toast)?

时间:2016-10-25 06:09:01

标签: angular toast ngrx

我正在使用ngrx / store构建angular2应用程序。在redux生命周期中我应该调用方法来显示通知(toast)?

我目前的猜测是我应该在副作用中使用它(我使用ngrx /效果)。

@Effect({ dispatch: false }) public newBidPublished$: any = this._actions$
    .ofType(BiddingStatusActions.NEW_BID_PUBLISHED)
    .map((action) => action.payload)
    .map((biddingStatus: GetBiddingStatusApiResponseModel) => {
        let msg = '<p>New bid has arrived.</p>';

        // PROBLEM HERE: I don't have access to previous bidding status here:
        if (biddingStatus.tenderRank !== 1 && previousBiddingStatus.tenderRank === 1) {
            msg += '<p>You are no longer in leading position.</p>';
        }

        this._notificationsService.info(msg);
    });

然而,有一个大问题:我需要访问以前的状态才能比较当前出价是否失去领先位置。我能够访问当前和以前状态的唯一地方是reducer。但我怀疑这是一个显示通知的好地方,因为它不是服务,我不能在那里注入NotificationService。

2 个答案:

答案 0 :(得分:1)

您可以将Store注入Effects类,并可以从那里访问它。

constructor(
    private actions$: Actions,
    private store: Store<State>,
) { }

private state$ = this.store.withLatestFrom(state => state).take(1);

现在你在Observable中拥有整个状态,你可以使用switchMap传递给其他Observable,或者使用其他运算符进行组合。

当然,你应该只选择你感兴趣的国家片段,而不是整个州。

答案 1 :(得分:1)

我会使用我自己的应用程序中的示例。重点是使用selector,它会在您修改之前为您选择当前状态(在将新数据从Effect移动到Reducer之前)。

@Effect()
logout$: Observable<RouterActions.All | AccountActions.All> = this.actions$
.ofType<AccountActions.Logout>(AccountActions.LOGOUT)
.pipe(
  exhaustMap(() => this.API.auth.revokeToken()),
  // We are using selector to get a slice of the state
  withLatestFrom(this.store.select(fromAccount.selectUser)),
  // The operator above returns an array and we select the second item
  // which is our user/your state.
  map(([, user]) => user),
  map((user: User) => this.redirectUser(user))
);