Нет поставщика для класса BaseService - PullRequest
0 голосов
/ 08 июня 2018

У меня есть проект на Angular 6. Некоторые из моих сервисов расширяют базовые классы.Базовые классы - это обычные классы TypeScript без декоратора @Injectable.Когда я пытаюсь запустить приложение, я получаю сообщение об ошибке:

NullInjectorError: Нет провайдера для HttpCommonService!

Дикая догадка - возможно, это как-то связано с DI (так как я расширяю некоторые компоненты из других базовых классов без декоратора @Component, и он отлично работает), но даже в случае DI я не создаю новый экземпляр базового класса отдельно от расширенного класса обслуживания.

В чем проблема или, по крайней мере, где я должен искать проблему?

Примеры

Это базовый класс:

export class HttpCommonService {
  constructor(protected http: HttpClient) {}

  /* Methods here */
}

Этосервис, внедренный в корень приложения

@Injectable({ providedIn: 'root' })

export class HttpService extends HttpCommonService {
  constructor(protected http: HttpClient) {
    super(http);
  }

  /* Methods here */
}

1 Ответ

0 голосов
/ 06 августа 2018

Похоже, что это ошибка в Angular - в настоящее время он имеет открытый статус: Аннотация ProvidedIn не совместима с классами получения

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

Чтобы обойти эту проблему, в любых производных классах мы должны установить для ngInjectableDef значение undefined.Это, в свою очередь, вызывает предоставленную логику для создания фабрики для нас

Или вы можете объявить службу по-старому и установить тип службы в разделе поставщиков в декораторе NgModule:

    @NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpClientModule
  ],
  providers: [HttpService],
  bootstrap: [AppComponent]
})
export class AppModule { }

Я знаю, что это не самый предпочтительный способ работы в Angular 6, но он все еще поддерживается и обойдет вашу проблему.

И я вижу, что вы уже пробовали это,Однако это определенно должно работать, так как мой сервис был настроен до того, как я обновил Angular 6 с 5. Это может указывать на то, что вы пропустили какую-то конфигурацию.Вы не забыли удалить предоставленный параметр In из Injectable decorator?

...