Angular 2.0.2:ActivatedRoute在服务中为空

Angular 2.0.2:ActivatedRoute在服务中为空,angular,angular2-routing,Angular,Angular2 Routing,我想使用ActivateRoute在服务中获取路由参数,就像在组件中一样。 但是,当我在服务中注入ActivatedRoute对象时,它包含一个空的params变量 我创造了一个可以复制这种行为的plunker: 请注意,其目的是在服务中而不是在组件中使用参数,设置plunker的方式纯粹是为了演示问题 组件(test已检索): 导出类组件实现OnInit{ 结果:字符串; 构造函数(专用路由:ActivatedRoute){ } 恩戈尼尼特(){ this.route.params.subs

我想使用ActivateRoute在服务中获取路由参数,就像在组件中一样。 但是,当我在服务中注入ActivatedRoute对象时,它包含一个空的params变量

我创造了一个可以复制这种行为的plunker:

请注意,其目的是在服务中而不是在组件中使用参数,设置plunker的方式纯粹是为了演示问题

组件(
test
已检索):

导出类组件实现OnInit{
结果:字符串;
构造函数(专用路由:ActivatedRoute){
}
恩戈尼尼特(){
this.route.params.subscribe(params=>{
this.result=params['test'];
});
}
}
服务(
test
未检索到):

导出类服务{
结果:字符串;
构造函数(专用路由:ActivatedRoute){
这是getData();
}
getData(){
this.route.params.subscribe(params=>{
this.result=params['test'];
});
}
}

我在您提供的Plunker代码中看不到
routerLink
指令

您需要使用
routerLink
指令导航到您提供参数的组件,然后只有您可以检索它。例如:

<a routerLink="/myparam" >Click here to go to main component</a>
单击此处转到主组件

服务
这里有一个属于根注入器的单例,注入了

出口有自己的喷油器和喷油器

是让路由组件拥有自己的
服务
实例:

@Component({
  ...
  providers: [Service]
})
export class MainComponent { ... }
当多个服务实例不是问题时,提供了一个很好的解决方案

以下解决方案直接从路由器获取参数,并允许服务具有一个实例:

导出类服务{
结果:字符串;
构造函数(专用路由器:路由器){
this.result=router.routerState.snapshot.root.children[0].url[index].path
}
}
或作为可观察的:

导出类服务{
结果:字符串;
构造函数(专用路由器:路由器){
this.router.routerState.root.children[0].url.map((url)=>{
this.result=url[index].path;
});
}
}
或者,当routerState不可用时:

导出类服务{
结果:字符串;
构造函数(专用路由器:路由器){
this.router.parseUrl(this.router.url).root.children.primary.segments[index].toString();
}
}

Index是参数在url中的位置。

我遇到了这个问题,我最后给出的工作解决方案如下

@Component({
  selector: 'app-sample',
  styleUrls: [`../sample.component.scss`],
  templateUrl: './sample.component.html',
})
export class AppSampleComponent {
  constructor(private route: ActivatedRoute,
              private someService: SomeService){}
  public callServiceAndProcessRoute(): void {
    this.someService.processRoute(route);
  }
}

@Injectable()
export class SomeService {
  public processRoute(route: ActivatedRoute): void {
  // do stuff with route
  }
}

因此,您将把
ActivatedRoute
作为参数传递给服务。

我不确定将路由注入服务是否是一个好主意<代码>服务是一个单例<代码>激活的路由不可用。我想,
ActivatedRoute
实例只是组件和服务不同而已。@estus说得通,我可以通过函数将参数传递给服务。但是这看起来很笨拙。plunker重定向到
/success
,然后被检索,不需要额外的导航这肯定是一个解决方案,但创建多个单例服务有其缺点。例如,如果这个服务执行一个http请求,然后缓存结果,那么它会对每个服务实例这样做,我猜它们应该是两个不同的服务。一个是单例,另一个是特定于当前路由的。整个模式在Angular 1中几乎相同。如果你有一些真实世界的设计问题,请随时根据上下文更新问题。好吧,你解决了我在这里描述的问题,所以我会保持原样。我将找出将服务拆分是否会奏效,并在不奏效时创建新问题。非常感谢您的帮助如果服务的唯一目的是在多个组件之间保持特定状态(使用url作为唯一的真实来源),那么创建单一组件也是不可能的。在使用此方法时,是否有方法使用RouterTestingModule对服务进行单元测试?在注入的路由器中,router.routerState.snapshot.root.children默认为空。