在路由级别为相同的 InjectionToken 提供不同的提供者

时间:2021-07-13 02:23:51

标签: angular dependency-injection

我有一个组件,我想在两条不同的路线中使用它,并为每条路线提供不同的服务 - 但我不确定如何做到这一点。我想避免在组件中放置逻辑来决定使用哪个服务。

class MyPage {
    constructor(service: MyServiceInterface)
}

路线

routes = [
  { path: 'one', component: MyPage }, 
  { path: 'two', component: MyPage }
]

然后在模块中 - 我想为每个路由的 MyServiceInterface 提供不同的服务

providers: [
   { provide: MyServiceInterface, useClass: PageOneService }, 
   { provide: MyServiceInterface, useClass: PageTwoService }
]

1 个答案:

答案 0 :(得分:0)

正如 Andrei 在对问题的评论中所说的那样,无法将提供者与路线相关联。在像您这样的情况下,当您有两个路由与同一个组件相关联时,组件可以知道使用哪个路由来实例化它,但只有在其构造函数被注入所有内容之后。 >

基本上你必须改变你的策略,而不是依赖注入的服务,你应该使用路由的 dataresolve 属性。

  • data 用于静态数据
  • resolve 调用可以获取动态数据的守卫。

在您的情况下执行此操作的一种方法是使用两个不同的守卫(PageOneGuardPageTwoGuard),这取决于相应的服务(PageOneServicePageTwoService)并最终生成一个组件可以使用的值。