NGRX Влияет, как передать параметр в оператор withLatestFrom - PullRequest
0 голосов
/ 02 октября 2018

Я испытываю трудности с передачей параметра в селектор при использовании withLatestFrom, который был отображен ранее из полезной нагрузки действия загрузки

loadLocalSubServices$: Observable<Action> = this.actions$.pipe(
  ofType(LocalSubServiceTemplateActions.LocalSubServicesTemplateActionTypes.LoadLocalSubService),
  map((action: LocalSubServiceTemplateActions.LoadLocalSubService) => action.payload.globalSubServiceId),
  // and below I would like to pass globalSubServiceId
  withLatestFrom(this.store.pipe(select(fromLocalSubservices.getSearchParams(globalSubServiceId)))),
  map(searchParams => searchParams[1]),
  mergeMap((params) =>
    this.subServiceService.getLocalSubServices(params).pipe(
      map(localSubServices => (new LocalSubServiceTemplateActions.LocalSubServiceLoadSuccess(localSubServices))),
      catchError(err => of(new LocalSubServiceTemplateActions.LocalSubServiceLoadFail(err)))
    )
  )
);

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Я думаю, у меня есть рецепт, который вы (или будущие странники) ищете.Вы должны сопоставить начальную полезную нагрузку (оператор of ниже) с внутренней наблюдаемой, чтобы ее можно было передать по конвейеру и передать в качестве параметра withLatestFrom.Затем mergeMap сгладит его, и вы сможете вернуть его следующему оператору как один массив с начальной полезной нагрузкой в ​​качестве первого значения.

map(action => action.payload),
mergeMap((id) =>
    of(id).pipe(
        withLatestFrom(
            this.store.pipe(select(state => getEntityById(state, id))),
            this.store.pipe(select(state => getWhateverElse(state)))
        )
    ),
    (id, latestStoreData) => latestStoreData
),
switchMap(([id, entity, whateverElse]) => callService(entity))
0 голосов
/ 02 октября 2018

Вы должны быть в состоянии использовать функцию стрелки.

        loadLocalSubServices$: Observable<Action> = this.actions$.pipe(
            ofType(LocalSubServiceTemplateActions.LocalSubServicesTemplateActionTypes.LoadLocalSubService),
            map((action: LocalSubServiceTemplateActions.LoadLocalSubService) => action.payload.globalSubServiceId),
            (globalSubServiceId) => {
                return withLatestFrom(this.store.pipe(select(fromLocalSubservices.getSearchParams(globalSubServiceId))));
            },
            map(searchParams => searchParams[1]),
            mergeMap((params) =>
              this.subServiceService.getLocalSubServices(params).pipe(
                map(localSubServices => (new LocalSubServiceTemplateActions.LocalSubServiceLoadSuccess(localSubServices))),
                catchError(err => of(new LocalSubServiceTemplateActions.LocalSubServiceLoadFail(err)))
              )
            )
          );            
...