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

Having different providers for the same InjectionToken at the route level

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

class MyPage {
    constructor(service: MyServiceInterface)
}

路线

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

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

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

正如 Andrei 在对该问题的评论中所说,无法将提供商与路线相关联。在像你这样的情况下,当你有两个与同一个组件相关联的路由时,该组件可以知道哪个路由被用来实例化它,但只有 after 它的构造函数被注入所有东西.

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

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

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