我正在使用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。
答案 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))
);