Angular Выборочный импорт / инъекция - PullRequest
0 голосов
/ 30 апреля 2020

Возможно ли в Angular 8 выборочный импорт / внедрение во время выполнения? У меня есть старый сервис, который я хочу использовать в новом проекте в той же рабочей области ng-cli, но новый проект использует встроенную маршрутизацию Angular, а старый использует стороннюю маршрутизацию.

Таким образом, в конструкторе службы я могу сделать это

    let app = this.config.get('application');
    if (app == 'legacy') {
        this.state = this.injector.get<any>(StateService);
    }

Это означает, что мне не нужно вводить его, но новый код проекта все еще не работает, потому что StateService не имеет поставщика

ERROR Error: Uncaught (in promise): NullInjectorError:
StaticInjectorError(AppModule)[StateService]:   
StaticInjectorError(Platform: core)[StateService]: 
     NullInjectorError: No provider for StateService! Error: NullInjectorError: No provider for StateService!

Что я знаю, потому что не хочу его использовать. Есть ли способ сделать это без импорта стороннего модуля?

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020

Вы можете определить другого поставщика https://angular.io/guide/dependency-injection-providers

// old project
providers: [
{ provide: StateService, useValue: OldStateService }
],

// new project
providers: [
{ provide: StateService, useValue: NewStateService }
],
1 голос
/ 30 апреля 2020

Вы всегда можете создать провайдера во время выполнения:

Injector.create({providers: [...]})
0 голосов
/ 07 мая 2020

Оказывается, код в OP работал просто отлично.

let app = this.config.get('application');
if (app == 'legacy') {
    this.state = this.injector.get<any>(StateService);
}

- это все, что нужно, проблема в моем случае заключалась в выражении if. (Служба конфигурации загружала данные из неправильного места, поэтому if всегда было верным)

Я бы добавил предупреждение о том, что я использую сгенерированные клиентом службы из angular 6+, которые предоставляются для root

@Injectable({providedIn: 'root'})

В случае, если это будет иметь значение для людей с подобной проблемой в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...