2016-10-25 1 views
3

저는 angular2 앱을 ngrx/store로 구축하고 있습니다. 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와 다른 Observables은에 전달하거나 다른 연산자를 사용하여 결합 할 수 있음을, 감시 오브젝트의 전체 상태를 가지고있다.

물론 모든 상태가 아닌 관심있는 조각 만 선택해야합니다.

+0

시도했지만 이전 상태를 유지하는 방법을 여전히 이해할 수 없습니다. 상태 $는 구독 할 때 여전히 최신 상태를 반환합니다. 시도 "take (2)"하지만 사용하지 마십시오. P. 나는 Rxjs에 초보자입니다. – user1131522

+0

이전 상태에 대한 액세스가 필요한 경우 분명히 감속기에 저장해야합니다. 이전 상태를 저장하는 방법에 대한 도움말은 Google에서 'redo/undo redux'를 Google에서 확인할 수 있습니다. 감속기에 이전 상태를 저장 한 후에는 설명 된 방법으로 간단히 액세스 할 수 있습니다. 그건 그렇고 :'take (1)'연산자는'Observable에서 한 요소를 취한 후에 구독을 취소합니다. 그것 없이는 앱에서 메모리 누출 가능성이 있습니다. –

관련 문제