2016-10-25 4 views
3

私はngrx/storeでangular2アプリを構築しています。 reduxライフサイクルでは、通知(トースト)を表示するメソッドを呼び出す必要がありますか?reduxライフサイクルでは、通知(トースト)を表示するメソッドを呼び出す必要がありますか?

私の現在の推測では、私は副作用(私は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); 
    }); 

は、しかし、一つの大きな問題がある:私は、現在の入札が主導的な地位を失った場合を比較できるようにする前の状態にアクセスする必要があります。現在の状態と以前の状態の両方にアクセスできる唯一の場所は減速器です。しかし、私はそれが通知を表示するための良い場所であるとは思わないし、サービスではないので、そこにNotificationServiceを挿入することはできません。

答えて

1

StoreをEffectsクラスに挿入し、そこからアクセスできます。

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

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

は、今あなたがswitchMapと他の観測に渡したり、他の演算子を使用して組み合わせることができますことを、観察可能で全体の状態を持っています。

もちろん、状態全体ではなく、興味のあるスライスを選択するだけです。

+0

それを試しても、以前の状態をどうやって取得するか分かりません。状態$は、それを購読するときに最新の状態を返します。 "take(2)"を試みましたが使用はありません。 S.私はRxjsの初心者です。 – user1131522

+0

前の状態にアクセスする必要がある場合は、明らかに減速機に保存する必要があります。以前の状態を保存する方法のヒントについては、Googleの 'redo/undo redux'をチェックアウトすることができます。以前の状態をレデューサーに保存した後は、私が説明した方法で簡単にアクセスできます。ちなみに、 'take(1)'演算子は 'Observable'から一つの要素を取り除いた後に退会します。それがなければ、あなたのアプリケーションに潜在的なメモリリークがあります。 –

関連する問題