Angular 2有条件地在组件中注入服务

时间:2017-04-17 11:08:42

标签: javascript angular dependency-injection angular2-services

前:

我有2项服务

1) one.service.ts

2) two.service.ts

我有一个组件 - dashboard.component.ts

import { Component, ViewEncapsulation, Inject } from '@angular/core';
import { OneService } from '../services/one.service';
import { TwoService } from '../services/two.service';

@Component({
  selector: 'dashboard',
  encapsulation: ViewEncapsulation.Emulated,
  styleUrls: ['./dashboard.less'],
  templateUrl: './dashboard.html'
})
export class DashboardComponent {
    constructor() {
       // Here how do I get service instance based on some this condition.
         if(true) {
             /* Service **one.service.ts** to be injected */
         } else {
             /* Service **two.service.ts** to be injected */    
         }

    }
}

1 个答案:

答案 0 :(得分:15)

您可以使用Injector

import { Injector } from '@angular/core'  
...
constructor(private injector: Injector){ 

  if(true) {
    this.oneService = <OneService>this.injector.get(OneService);
  } else {
    this.twoService = <TwoService>this.injector.get(TwoService);
  }
}

正如@MeirionHughes所提到的,这称为服务定位器模式:

  

该技术是服务定位器模式的一个示例。

     除非你真的需要,否则

避免这种技术。它鼓励像你在这里看到的粗心的抓包方法。很难解释,理解和测试。您无法通过检查构造函数来了解此类需要什么或将执行什么操作。它可以从任何祖先组件获取服务,而不仅仅是它自己的组件。你被迫对实现进行了解释,以发现它的作用。

     

框架开发人员在必须一般性地动态获取服务时可以采用这种方法。

来源:https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#explicit-injector

如上所述,您可以在其他服务中获取这些注入器,然后将此服务注入您的组件。