Angular 角度激活路由参数映射为空,具体取决于我在提供者中指定服务的位置

Angular 角度激活路由参数映射为空,具体取决于我在提供者中指定服务的位置,angular,angular-activatedroute,Angular,Angular Activatedroute,我正在使用ActivatedRoute从注入服务中的路由获取参数。如果在应用程序模块或应用程序组件中将服务指定为提供者,则调用该服务时,参数映射为空。如果我在拉入服务的组件中将其指定为提供者,则它具有该参数 为什么会这样。我很难找到关于ActivatedRoute的作用域以及它如何与服务交互的好信息 链接到plnkr中的此行为。取消对a.component.ts中第11行(providers字段)的注释,以便在单击“我”时看到它正在工作! 从'@angular/core'导入{Componen

我正在使用ActivatedRoute从注入服务中的路由获取参数。如果在应用程序模块或应用程序组件中将服务指定为提供者,则调用该服务时,参数映射为空。如果我在拉入服务的组件中将其指定为提供者,则它具有该参数

为什么会这样。我很难找到关于ActivatedRoute的作用域以及它如何与服务交互的好信息

链接到plnkr中的此行为。取消对a.component.ts中第11行(providers字段)的注释,以便在单击“我”时看到它正在工作!

从'@angular/core'导入{Component,OnInit}
从“./a.service.ts”导入{AService}
@组成部分({
选择器:“app-a”,
模板:`
你好{{id}
`,
//提供者:[AService]
})
导出类组件实现OnInit{
id:字符串;
构造函数(专用aService:aService){
}
恩戈尼尼特(){
this.id=this.aService.getId();
}
}

您看到的行为是由于ActivatedRoutes中
paramMap
成员的性质造成的。在服务构造函数中,您订阅了paramMap

constructor(private activatedRoute: ActivatedRoute) {
    this.activatedRoute.paramMap.subscribe(
      params => {
        this.id = params.get('id');
      }
    );
  } 
这将导致关联组件的路由快照。此时,由于您将
a.service.ts
声明为根模块
app.module.ts
的提供者,路由快照将不包含
:id
,因为它关联的组件是您的
app.component.ts
。因此,当您调用您的方法时

getId(): string {
    return this.id;
  }
您正在从组件接收路由的初始快照,该快照与
app.component.ts
关联,不包含值

但是,,当您声明
a.service.ts
为组件
a.component.ts
的提供者时,您就创建了
a.service.ts
的新本地实例。在这种情况下,对
paramMap
的订阅与
a.component.ts
和该组件的快照相关联包含
:id
参数,因此在调用
getid()
时返回给您

从:

导出类ActivatedRoute{
/**此路由的当前快照*/
_参数图:可观察;
...}

>

Brian,当您订阅ActiveRouter.ParamMap时,此订阅与您进行订阅的组件有关。在您的情况下,参数“id”仅在显示a.component时更改。如果您的服务在app.ts中声明,则没有参数“id”(显示app.ts的路径为“/”)。当您在a-app.ts中声明服务时,是该服务的另一个实例,这是因为在本例中您有“id”参数。假设您有一个父“home”和两个孩子“home/detail/:id”和“home/list/:id”,您必须在两个孩子中订阅activeRouter.paramMap,因为“home”没有参数“id”
getId(): string {
    return this.id;
  }
export class ActivatedRoute {
     /** The current snapshot of this route */
       _paramMap: Observable<ParamMap>;
    ...}