Подтвердить что ты не робот

Angular 2 условно инжектирует сервис в компоненте

Пример:

У меня есть 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 */    
         }

    }
}
4b9b3361

Ответ 1

Вы можете использовать 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, это называется шаблоном локатора службы:

Этот метод является примером шаблона локатора службы.

Избегайте этой техники, если она вам не нужна. Он поощряет небрежный подход к захвату, как вы видите здесь. Трудно объяснить, понять и проверить. Вы не можете знать, проверяя конструктор, что этот класс требует или что он будет делать. Он мог бы получать услуги от любого компонента-предка, а не только от своего собственного. Вы вынуждены освободить реализацию, чтобы узнать, что она делает.

Разработчики Framework могут использовать этот подход, когда они должны получать услуги в общем и динамическом режиме.

Источник: https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#explicit-injector

И снова, как уже упоминалось, вы можете получить эти инжекторы в другой службе, а затем вставить эту услугу в свой компонент.