3

我有一个声明如下的路径:

{
  path: 'app/:userId',
  children: [...AppChildrenRoutes]
}

然后,在 AppChildrenRoutes 内部

{ path: 'feature', component: MainFeatureComponent }

因此,在我的应用程序的某个时刻,我可以拥有localhost:4200/app/123/feature. 在这个组件中,通过一些操作,我可以导航到另一条路线,如下所示:

this.router.navigate([
  'app',
  this.userId,
  'feature',
  { search: this.searchFor }
]);


将其视为一个正在改变架构的大型企业级应用程序,逐步使用 NgRx。
所以,我遇到了路由器商店的问题。我已经设置了所有内容并且可以正常工作。
在路由器商店文档之后,我编写了一个自定义序列化程序,它看起来像这样

serialize(routerState: RouterStateSnapshot): RouterStateUrl {
  const { url } = routerState;
  const queryParams = routerState.root.queryParams;

  while (route.firstChild) {
    route = route.firstChild;
  }
  const params = route.params;

  return { url, queryParams, params };
}

我发现,考虑到像这样的URI

localhost:4200/app/123/feature;search=blue

route.params只返回参数,而search不是两者userIdsearch

- 我怎样才能实现从路径CustomSerializer中返回所有内容?params(在这种情况下,两者都是userIdsearch)。

我有点尝试但失败了,while循环的每次迭代,检查是否有一个参数并将它们添加到一个对象直到最后一个。好的、好的还是坏的方法?我怎么能做到这一点而不失败?
谢谢。

4

2 回答 2

5

我有一个类似的问题,并通过在每次循环时扩展 params 对象来解决它。

我的 CustomSerializer 现在看起来像这样:

export class CustomSerializer implements RouterStateSerializer<RouterStateUrl> {
serialize(routerState: RouterStateSnapshot): RouterStateUrl {
    let route = routerState.root;

    let params = {};
    while (route.firstChild) {
        params = {
            ...params,
            ...route.params
        };
        route = route.firstChild;
    }

    const {
        url,
        root: { queryParams }
    } = routerState;

    return { url, params, queryParams };
}

}

于 2018-09-10T09:47:03.447 回答
0

您可以使用选择器选择任何父/子路由,并且不需要序列化程序。您有一个根 Route 对象,通过创建选择器,您可以遍历路由并获取所需的参数。

const selectRouter = createFeatureSelector<XStore,
    fromRouter.RouterReducerState<any>>('router');

export const selectAllRouteParam = (param: string) => createSelector(
    selectRouter,
    (router: RouterReducerState) => {
        let current = router.state.root;

        while (current) {
            if (current.params && current.params[param]) {
                return current.params[param];
            } else {
                current = current.firstChild;
            }
        }
    }
);

在使用时,您可以像这样使用它:

userId$ = this.store.select(selectAllRouteParam('userId'))

聚会迟到了,但我希望将来有人会觉得这很有帮助。

于 2020-07-28T18:37:36.860 回答