如何使用 ngrx-router-store 在 ngrx 效果中获取路由参数?

Posted

技术标签:

【中文标题】如何使用 ngrx-router-store 在 ngrx 效果中获取路由参数?【英文标题】:How to get route params inside ngrx effects using ngrx-router-store? 【发布时间】:2018-06-20 09:18:25 【问题描述】:

我有一个效果类,我想根据路由器参数 ID 加载详细信息

@Effect()
  getDetails$ = this.actions$.ofType(DetailActions.GET_DETAILS).pipe(
    map(toPayload),
    switchMap(payload => 
      return this.detailService
        .getDetail(payload)//I want router params here in payload
        .pipe(
          map(detail=> new DetailActions.GetDetailSuccess(detail)),
          catchError(error =>
            Observable.of(new DetailActions.GetDetailFail(error))
          )
        );
    )
  );

我想在payload中获取路由器参数,这样我就不用从组件中传递payload,而是直接从效果类中获取。

【问题讨论】:

【参考方案1】:

如果您已经有一个选择器映射到您的应用路由器状态:

export const getRouterState = createFeatureSelector<
  fromRouter.RouterReducerState<RouterStateUrl>
>('router');

然后您可以使用rxjs/operators 中的withLatestFrom 从路由器状态获取参数,并可能将它们与您的操作的有效负载合并,如下所示:

@Effect()
getDetails$ = this.actions$.pipe(
    ofType(DetailActions.GET_DETAILS),
    withLatestFrom(
        this.store.select(fromRoot.getRouterState),
        (action, router) => 
            // do your logic here
            // and return a newPayload:
            return 
                id: router.state.params.id,
                payload: action.payload
            
        
    ),
    switchMap(newPayload => 
        return this.detailService
        .getDetail(newPayload)
        .pipe(
            map(detail=> new DetailActions.GetDetailSuccess(detail)),
            catchError(error => Observable.of(new DetailActions.GetDetailFail(error)))
        );
    )
);

【讨论】:

嗨塞勒姆。你能解释一下selector mapping to your app router state:。我不知道how to create a selector mapping to my router state。你能解释一下或告诉我可以从哪里了解它的来源吗? @Raj Todd Motto 在这个精彩的视频中更好地解释了这一点:youtu.be/YsG44g6_Fo0。您还将在本文中找到另一个示例:blog.angularindepth.com/ngrx-parameterized-selector-e3f610529f8 嗨,Salem,经过您的解决方案后,我可以访问路由器参数。我还想从路由解析器访问数据。你能看看这个question

以上是关于如何使用 ngrx-router-store 在 ngrx 效果中获取路由参数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在发布管道中使用输出变量

如何在Hive&Impala中使用UDF

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何在android中使用WCF服务?