【问题标题】:Angular 2 Route Params in Child Routes子路由中的 Angular 2 路由参数
【发布时间】:2016-11-25 02:54:10
【问题描述】:

我有一条路线:/app/project/23/views

路径的每一部分都是前一部分的子节点,所有子节点都是延迟加载的(不确定这里的延迟加载位是否相关)

/app           (root  component)
  /project     (child component of app, child route of app)
    /23        (route param 'projectId')
      /views   (child component of project, child route of project)

我正在尝试访问路由参数“projectId”(在本例中:23)

执行以下操作:

constructor(private route: ActivatedRoute) {}
ngOnInit() {
    this.route.params.subscribe(params => {
        console.log('params:', params);
}

给我一​​个 this.route.params 的空对象

params: {}

但是这样做:

constructor(private route: ActivatedRoute) {}
ngOnInit() {
    this.route.parent.parent.params.subscribe(params => {
        console.log('params:', params);
}

给我我想要的东西:

params: Object {projectId: "23"}

因为是子路由,是不是必须指定 this.route.parent.parent 才能获取(某些)父路由的路由参数?

有没有更好的方法从 full 路由中获取参数,因为如果发生以下情况会发生什么:

1) 我改变了子路径的深度并将其向下移动了一步。我现在是否必须更改我的代码才能说 this.route.parent.parent.parent.params

2) 或者说它是第 10 代(代?,子?,曾曾孙?)。然后我必须说:this.route.parent.parent.parent.parent.parent.parent.parent.parent.parent.params

--- 编辑:添加路由配置文件---

app.routing.ts

const routes: Routes = [
  {path: 'app', loadChildren: './views/private/private.module#PrivateModule'}
];

private.routing.ts

const routes: Routes = [{
  path: '',
  component: PrivateComponent,
  children: [            
    {path: 'project', loadChildren: './project/project.module#ProjectModule'},
    {path: '', redirectTo: 'project', pathMatch: 'full'}
 ]

project.routing.ts

const routes: Routes = [{
  path: ':projectId',
  component: ProjectComponent,
  children: [
    {path: 'views', loadChildren: './views/views.module#ViewsModule'},
    {path: '', redirectTo: 'views', pathMatch: 'full'}
  ]

【问题讨论】:

  • 能否请您显示所有路由配置。您想在哪个组件中访问params
  • @mxii 添加了路由配置

标签: angular angular2-routing


【解决方案1】:

您可以使用pathFromRoot 属性访问路由树,它返回一个包含所有父级的ActivatedRoutes 数组。

this.route.pathFromRoot[2].params

【讨论】:

    【解决方案2】:

    由于你提到的原因,我也认为本地化路由参数是一个糟糕的设计决策。这不是服务器端路由的工作方式,我不确定他们为什么觉得他们的路由器应该有所不同。

    由于我也不能依赖参数始终位于路由的同一路径中,因此我有一个更通用的解决方案,它将所有参数组合成一个 Observable。

    import { Observable } from 'rxjs/Observable';
    import { map } from 'rxjs/operators';
    import { ActivatedRoute, Params } from '@angular/router';
    
    /**
     * Merges all parameters within the routing tree into a single observable. 
     * This allows child routes to access parameters from their parents
     * @param route An activated route
     */
    export function routeParams(route: ActivatedRoute): Observable<Params> {
        return Observable.combineLatest(route.pathFromRoot.map(t => t.params))
            .pipe(
                map(paramObjects => Object.assign({}, ...paramObjects))
            );
    }
    

    如果您有一个路由 person\1\view\details ,则示例用法将打开,其中 1 是您路由配置中上述多个父级的 id 参数。如果你想要details路由中的id参数,如果你使用上面的代码并订阅那个observable,你会得到{"id": "1"}

    routeParams(this.route).subscribe(params =&gt; console.log(params))

    【讨论】:

    • 这是一个聪明的解决方案。我确实看到了我多次遇到的一个小缺点。如果是 '/class/:id/user/:id' 这样的路由,则无法区分哪个 :id 是哪个。我已经开始使用详细的参数名称来避免这种情况,但仍然不时发生
    • 是的,不幸的是路由和参数的性质。我正在更新这篇文章以显示我创建的辅助函数。
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 2016-11-25
    • 2017-05-10
    • 2016-09-21
    • 1970-01-01
    • 2017-08-10
    • 2016-09-20
    • 2016-03-16
    相关资源
    最近更新 更多