Angular 11: можно ли внедрить службу по условию из входа

У меня есть действительно большой компонент, который работает со службой загрузки данных, и вместо того, чтобы переписывать аналогичный компонент для работы с новой службой, я написал службу со всеми теми же функциями, что и первый, и я пытаюсь динамически изменять внедрение службы в конструктор компонента с использованием ввода.

Итак, у меня будет:

@Input() isLocal= false;

private service: Service1|Service2;

constructor(private injector: Injector) {
  if (this.isLocal) {
    this.service = injector.get(Service1);
  } else {
    this.service = injector.get(Service2);
  }
}

Моя проблема в том, что я не могу получить доступ к своему вводу в конструкторе и не могу запустить свою службу в ngOnInit. Как я могу этого добиться?


person user3659739    schedule 25.01.2021    source источник


Ответы (1)


Было бы лучше, если бы вы реализовали шаблон Factory, как описано здесь:

angular.service против angular.factory

Но для этого вы можете использовать класс Injector из ядра Angular:

import { Injector } from '@angular/core'  
...

@Input() isLocal= false;
...

constructor(private injector: Injector){ 

  if(this.isLocal) {
    this.oneService = <OneService>this.injector.get(Service1);
  } else {
    this.twoService = <TwoService>this.injector.get(Service2);
  }
}
person Clive Ciappara    schedule 25.01.2021
comment
Возможно, я не понимаю вашего ответа, но я не думаю, что он отвечает на мой вопрос, потому что в конструкторе я не могу получить доступ к моей переменной isLocal, только в ngOnInit, и мне не нужны 2 переменные для служб, мне просто нужна одна - person user3659739; 26.01.2021