【问题标题】:Is it possible to gather all the params from an ActivatedRoute in angular?是否可以从 ActivatedRoute 以角度收集所有参数?
【发布时间】:2017-07-26 00:53:10
【问题描述】:

我正在创建 Angular 4 应用程序。碰巧我需要从我的 URL 获取不同深度级别的参数,导致获取参数的方式不统一。

假设我们有这个网址:

https://mysite/companies/:companyID/cups/:cupId/drawings/:drawId

通常,根据角度文档,我们需要执行以下操作:

ngOnInit() {
this.activatedRoute.parent.parent.params.subscribe((params: Params) => 
{this.companyId = params['companyId'];
});
this.activatedRoute.parent.params.subscribe((params: Params) => 
{this.cupId = params['cupId'];
});
this.activatedRoute.params.subscribe((params: Params) => 
{this.drawId = params['drawId'];
});
}

请注意,这是考虑到我们在 DrawDetailComponent 内部,这意味着我们在一个组件中,该组件是此层次结构中的最后一个子组件。

另外请注意,根据您在此层次结构中的深度,您需要将 .parent 添加到您的activatedRoute 以位于正确的位置,您可以成功获取您正在寻找的参数。

那么,是否可以通过同一个调用获取来自您的 url 的所有参数?

类似:

this.activatedRoute.parent.parent.params.subscribe((params: Params) => 
    {this.companyId = params['companyId'];
    {this.cupId = params['cupId'];
    {this.drawId = params['drawId'];
});

我们希望有一种统一的、不依赖于深度的方式来从我们的 URL 中检索所有参数。

其实我们也试过这样的:

const property = 'companyId';
this.activatedRoute.pathFromRoot.forEach((item) => {
  if (item.snapshot.params.hasOwnProperty(property)) {
    item.params.subscribe((params: ParamMap) => {
      this.companyId = params[property];
    });
  }
});

但我们希望找到一种更好、更通用、可测试的方法。

通常,在 Django 之类的框架中,开发人员能够一步收集来自 url 所需的所有信息。在 Angular 的情况下,订阅自动处理这些参数的更改是可以的,但恕我直言,它远非舒适 + 可测试。

【问题讨论】:

  • 在这里你可以做的就是遍历父母。您正在与框架作斗争,路由器不应该那样使用。 Angular 不是 Django。开发人员从 A1 路由器中吸取了深刻的教训。 A4 路由器被设计为高度模块化,将其视为封装的一种特殊情况。子路由应该不知道父母,并通过data、自己的参数和公共提供者接收他们需要的所有东西。您可能在应用设计中遇到 XY 问题,应该通过其他方式解决。
  • 谢谢,有趣的答案,它为我指明了另一个方向,可能更合适。您能否分享一些描述上述 XY 问题的链接?另一方面,假设我们有 4 个组件,A、B、C、D,每个组件都嵌套在前一个组件中:A -> B -> C -> D 并且您需要在 C 中获取来自 3 个的数据父组件。通过在每个组件中使用 @Inputs 来共享该数据是否正确? D 组件最终将有 3 个输入,只能访问来自父级的简单参数。

标签: angular angular-routing angular-router


【解决方案1】:

认为你应该可以做这样的事情:

this.activatedRoute.params.subscribe(params => {
    this.companyId = params['companyId'];
    this.cupId = params['cupId'];
    this.drawId = params['drawId'];
});

我很幸运在我的应用程序中遇到了类似的情况。请注意,我不会去找父母。激活的路线应该有你需要的一切。

希望这会有所帮助!

【讨论】:

  • 我同意。我这样说是知道有例外的。但是当人们想要“松散”的路由功能时,我总是有点畏缩。动态路由肯定有用例,但在动态之上嵌套动态的用例并不多。在整个应用程序中,您的路由应该是最可预测和最一致的。
  • @R。理查兹,这对我们不起作用。请注意我们在这里有嵌套的路线。假设您有一个模块,在本例中为 CompanyModule,它有一个子模块:CupModule,每个模块都有自己的路由。当您从 CupModule 中的任何组件内部请求激活路由时,它不知道父模块路由。这就是为什么在示例中我们有 3 个不同级别的 .parent 嵌套请求,具体取决于深度。
  • @joshrathke,通常在 Django 之类的框架中,我只需在需要时通过一个简单的调用即可获得所有参数。我认为这不是 Angular 中一个完全成熟的功能。也许对这个问题有一些答案我会改变主意:)
猜你喜欢
  • 1970-01-01
  • 2021-01-09
  • 2018-10-10
  • 2013-09-15
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多