【问题标题】:Is there a way to inject a different service based on route in angular 2?有没有办法根据角度 2 中的路线注入不同的服务?
【发布时间】:2019-02-17 15:02:57
【问题描述】:

我对 Angular 2 及其依赖注入能力有些陌生,但还没有找到一种简单的方法来根据路由更改组件依赖关系。

I.E. 给定一个接受服务的组件。

MyReusableComponent {
   constructor(private service: ServiceIWantToChange){}
}

假设我在 Web 应用程序的不同部分添加了一条新路由,该路由将重用该组件。

我想做这样的事情: 新区域路由模块

{ 
   path: "newRoute",
   component: MyReusableComponent,
    ** my made up provider area ** -providers: [{provide: 
      ServiceIWantToChange, useClass: MyServiceWithChanges}]
}

这就是我想到的一种处理位置敏感依赖关系的方法。

我认为我可以提供组件的覆盖实现,为可重用组件提供新的依赖关系,但我希望只是更改路由中的依赖关系。

我一直在围绕解析器等进行研究,但这些似乎更多地用于提供数据。我还注意到有人注入了注射器并进行了 if 检查以获得正确的组件。看到了几种不同的方式。我确信我在路由和 DI 方面缺少一些东西,但我找不到任何简单的东西。我知道有变通办法,但希望找到更优雅的解决方案,只是想知道我想做的事情是否可行。

谢谢!

以下是用例详细信息,以防我通常遇到此错误...我想重复使用完全相同的组件,但让它将请求发送到一组不同的端点。

【问题讨论】:

    标签: angular dependency-injection routing angular2-routing


    【解决方案1】:

    将注入令牌与路由数据相结合可以为您提供所需的结果。 使用不同的注入令牌提供您的服务:

    const FIRST_SERVICE_TOKEN = new InjectionToken<string>("FirstService"); 
    const SECOND_SERVICE_TOKEN = new InjectionToken<string>("SecondService"); 
    
    @NgModule({
      providers: [
         {
            provide: FIRST_SERVICE_TOKEN,
            useClass: FirstService
         },
         {
            provide: SECOND_SERVICE_TOKEN,
            useClass: SecondService
         }
      ],
    })
    class AppModule {}
    

    然后,使用路由数据指定每个路由的依赖关系:

    {path: 'first-route', component: MyComponent, data: {requiredService: FIRST_SERVICE_TOKEN}},
    {path: 'second-route', component: MyComponent, data: {requiredService: SECOND_SERVICE_TOKEN}}
    

    最后使用路由数据获取对应的服务

    export class MyComponent{
       private myService;
       constructor(route: ActivatedRoute, injector:Injector){
           const serviceToken = route.snapshot.data['requiredService'];
           this.myService = injector.get(serviceToken)
       }
    }
    

    【讨论】:

    • 感谢 Fartab!鉴于 injector.get 的弃用,您能否建议如何更新此内容?
    • 根据我的阅读,下面将暂时解决这个问题:this.myService = injector.get&lt;string&gt;(&lt;any&gt;serviceToken); 请参阅这个使用 Fartab 示例代码的示例:stackblitz.com/edit/angular-route-service-injection-tokens
    猜你喜欢
    • 2017-09-29
    • 2014-02-21
    • 2020-07-12
    • 1970-01-01
    • 2014-05-04
    • 2021-05-19
    • 2021-05-16
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多