0

我有关于 Angular 6 的项目。我的一些服务扩展了基类。基类是没有@Injectable装饰器的常规 TypeScript 类。当我尝试运行应用程序时,出现错误:

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 */
}
4

1 回答 1

0

看起来这是 Angular 的一个错误 - 它目前处于打开状态: ProvidedIn Annotation Not Compatible With Deriving Classes

对于具有同样是可注入服务的基类的服务,我也遇到了同样的问题。您可以尝试链接错误中建议的解决方法:

为了解决这个问题,在任何派生类中,我们必须将 ngInjectableDef 设置为 undefined。这反过来调用providedIn逻辑为我们创建一个工厂

或者你可以用老式的方式声明服务,并在 NgModule 装饰器的提供者部分设置服务类型:

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

我知道这不是 Angular 6 中做事的首选方式,但它仍然受支持并且可以解决您的问题。

我可以看到你已经尝试过了。但是,这绝对应该有效,因为这是在我从 Angular 5 升级到 Angular 6 之前配置我的服务的方式。这可能表明您错过了一些配置。你还记得从 Injectable 装饰器中删除 providedIn 选项吗?

于 2018-08-06T12:16:03.407 回答