外部ライブラリでHttpClient
サービスをインスタンス化しようとすると、そのライブラリをAngularアプリケーションで使用すると、StaticInjectorError
エラーが発生します:
Angular 5.0.0の場合:
AppComponent_Host.ngfactory.js? [sm]:1 ERROR Error:
StaticInjectorError[InjectionToken DocumentToken]:
StaticInjectorError[InjectionToken DocumentToken]:
NullInjectorError: No provider for InjectionToken DocumentToken!
at _NullInjector.get (core.js:993)
at resolveToken (core.js:1281)
at tryResolveToken (core.js:1223)
at StaticInjector.get (core.js:1094)
at resolveToken (core.js:1281)
at tryResolveToken (core.js:1223)
at StaticInjector.get (core.js:1094)
at resolveNgModuleDep (core.js:10878)
at _createClass (core.js:10919)
at _createProviderInstance$1 (core.js:10889)
Angular 5.2.0-rc.0の場合:
ERROR Error: StaticInjectorError(AppModule)[HttpXsrfTokenExtractor ->
InjectionToken DocumentToken]: StaticInjectorError(Platform:
core)[HttpXsrfTokenExtractor -> InjectionToken DocumentToken]:
NullInjectorError: No provider for InjectionToken DocumentToken!
at _NullInjector.get (core.js:994)
at resolveToken (core.js:1292)
at tryResolveToken (core.js:1234)
at StaticInjector.get (core.js:1102)
at resolveToken (core.js:1292)
at tryResolveToken (core.js:1234)
at StaticInjector.get (core.js:1102)
at resolveNgModuleDep (core.js:10836)
at _createClass (core.js:10877)
at _createProviderInstance$1 (core.js:10847)
これを、空白の@angular/cli
アプリケーションで再現しました。 angular-library-starter から空白のライブラリシードをインポートします。これは、HttpClientをインポートして使用しようとします。
(簡潔にするためにインポート行は切り捨てられます)
アプリケーション:app.module.ts
:
@NgModule({
declarations: [ AppComponent ],
imports: [ ..., ArithmeticModule.forRoot() ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
アプリケーション:app.component.ts
:
@Component({
...
})
export class AppComponent {
constructor(private sum: SumService) {}
}
ライブラリの場合、ライブラリモジュールにHttpClientModule
をインポートし、それをSumService
に挿入するだけでした。
ライブラリ:arithmetic.module.ts
:
@NgModule({
imports: [ HttpClientModule ]
})
export class ArithmeticModule {
public static forRoot(): ModuleWithProviders {
return {
ngModule: ArithmeticModule,
providers: [ SumService ]
};
}
}
ライブラリ:sum.service.ts
:
@Injectable()
export class SumService {
constructor(private http: HttpClient) {}
....
}
この設定により、投稿の上部に記載されているStaticInjectorError
エラーが発生します。
@angular/common/http
/ng.common.http
を追加しました。何か案は?
同様の問題が発生し、NgxMaskModule(2.2.2)のアップグレードを修正し、モジュールのインポートにNgxMaskModule.forRoot()を追加しました。
翻訳モジュールにはHttpClientを使用しています。以下のインポート方法を使用しています。
// translate
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
}),
App.module.ts。にHttpClientモジュールをインポートしてみてください
HttpClientModuleこの場合、ピアの依存関係になります。
したがって、メインアプリにHttpClientModuleをインポートする必要があります。
StaticInjectorError
Module.tsにHttpClientモジュールをインポートして、プロバイダーにサービスを追加してみてください。