【问题标题】:Pass route param from parent to child routes将路由参数从父路由传递到子路由
【发布时间】:2021-02-06 04:35:49
【问题描述】:

我的路线结构如下:

parent/:id
    |
    child
    |
    child

我可以通过以下方式从父组件获取参数:

ngOnInit() {
  this.route.params.subscribe((params) => {
      this.id = +params['id'];
  });
}

然后以某种方式将其作为输入附加到<router-output> 上?还是我必须像对待父母一样从每个孩子那里提取价值?

id 参数从父组件传递给所有子组件的最佳方法是什么?

【问题讨论】:

  • 如果我理解正确你的问题,关键是如何在组件树的深处传递参数。在这种情况下,请查看angular.io/docs/ts/latest/cookbook/…
  • 这本质上是个问题,是的。对于这个例子,服务会是什么样子?我如何从服务中获取参数以便能够注入孩子?

标签: angular angular2-routing


【解决方案1】:

使用 Angular 路由器 5(谁知道 2?),您不会走得太远;有一个父对象也是一个 ActivatedRoute。

在子路由中,可以这样获取:

ngOnInit() {
  this.route.parent.params.subscribe(params => {
    this.parentRouteId = +params["id"];
    console.log(this.parentRouteId);
  });
}

您的路线必须这样定义:

const routes: Routes = [
  {
    path: ':id',
    component: MyComponent,
    children: [
      { path: '', redirectTo: '/my-page' },
      { path: 'my-page', redirectTo: component: MyChildComponent }
    ]
  },
];

【讨论】:

  • 这个答案应该得到更多的支持,因为有几个类似的问题可以被这个回答。可以在 angular.io/guide/router#router-stateangular.io/api/router/ActivatedRoute#parent 找到 ActivatedRoute 上的父属性的相关文档
  • 您的答案实际上是我的问题的选项 B:“或者我是否必须像对待父母一样从每个孩子那里提取价值?”。我想当我问这个问题时,我希望有一种方法可以实现方法 A,而不必让孩子接受所有的路线信息。
  • @JamieKudla,我知道你的意思。第一种方式会很优雅,但这种方式行不通。因此,第二种方法是避免代码中出现大量混乱和复杂性的最佳方法。
  • 我的子路由包含 loadChilren,当我检查父路由时它为空
【解决方案2】:

自 Angular 5.2 以来,这个问题还有另一个答案

RouterModule.forRoot(routes, {
    paramsInheritanceStrategy: 'always'
})

您可以将设置传递给您的根 RouterModule 以告诉它始终从其父级继承。恕我直言,这应该是默认设置,但事实并非如此。这将允许从所有祖先继承所有参数。

【讨论】:

    【解决方案3】:

    不幸的是,没有简单的方法可以访问父路由参数,也没有计划更改它#12767,所以唯一的方法是使用 service 或 localStorage 来解决,无论你喜欢什么。

       class Service {
            public params:Subject<any> = new Subject<any>();
    
            public next(params):void { this.params.next(params); }
       }
    
       class Parent {
            constructor(service:Service, route:ActivatedRoute){
                 activatedRoute.params.subscribe(params => service.next(params));
            }
       }
    
       class Child {
            constructor(service:Service){
                 service.params.subscribe(params => console.log(params));
            }
       }
    

    以下是组件可以相互通信的一些方式: https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

    【讨论】:

    • 在这种情况下,服务会是什么样子?将id 参数放入服务以便能够注入子组件的最佳方法是什么?
    • 添加了简化示例。
    • 您对“next”和“params”的使用令人困惑,但这通常看起来像是这样做的方式,至少现在是这样。关于这个问题github.com/angular/angular/issues/13058 似乎还有一张未解决的票。您介意稍微详细说明一下 sn-p 以便我接受吗?
    • 您有具体问题吗?这个想法是使用额外的Subject 创建服务,并使用它将必要的事件重定向到子组件。我个人不喜欢这个解决方案,因为它不可重复使用。通用解决方案会自动合并所有活动路由参数并提供参数的最新快照,但这需要时间才能正确实施。
    • 这回答了有关方法以及 Angular 团队希望如何完成的问题。我试图实现这一点,但子组件无法订阅从父>服务>子发出的事件。见这里stackoverflow.com/questions/42280325/…
    猜你喜欢
    • 2017-08-24
    • 2017-11-21
    • 2016-12-08
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多