web-dev-qa-db-ja.com

angular4のプロバイダーにおけるmulti:trueの意味

Angular4でHTTP_INTERCEPTORSを使用しています。このため、HttpServiceInterceptorインターフェイスを実装し、HttpInterceptorメソッドの定義を提供するinterceptクラスを作成しました。次に、このようなHTTP_INTERCEPTORSの登録済みプロバイダー

providers: [{
    provide: HTTP_INTERCEPTORS,
    useClass: HttpServiceInterceptor,
    multi: true
}],

これは正常に機能しています。しかし、それでもmulti:trueの意味がわかりません。私は この答え を読みました。

multi:trueオプションを削除すると、ブラウザ側でエラーが発生します

Uncaught Error: Provider parse errors:
Mixing multi and non multi provider is not possible for token InjectionToken_HTTP_INTERCEPTORS ("[ERROR ->]"): in NgModule AppModule in ./AppModule@-1:-1
    at NgModuleProviderAnalyzer.webpackJsonp.487.NgModuleProviderAnalyzer.parse (vendor.js:36335)
    at NgModuleCompiler.webpackJsonp.487.NgModuleCompiler.compile (vendor.js:43184)
    at JitCompiler.webpackJsonp.487.JitCompiler._compileModule (vendor.js:51527)
    at vendor.js:51472
    at Object.then (vendor.js:26354)
    at JitCompiler.webpackJsonp.487.JitCompiler._compileModuleAndComponents (vendor.js:51470)
    at JitCompiler.webpackJsonp.487.JitCompiler.compileModuleAsync (vendor.js:51399)
    at PlatformRef_.webpackJsonp.0.PlatformRef_._bootstrapModuleWithZone (vendor.js:4746)
    at PlatformRef_.webpackJsonp.0.PlatformRef_.bootstrapModule (vendor.js:4732)
    at Object.<anonymous> (app.js:23366)

これは、HTTP_INTERCEPTORSが複数のディレクティブまたはコンポーネントを初期化するマルチプロバイダーであることを意味しますか?もしそうなら、他のディレクティブとコンポーネントは何ですか?

10
Sunil Garg

マルチプロバイダーはディレクティブとは何の関係もありません。 この回答 は、例としてディレクティブにのみ言及しています。

FOOが注入トークンであることを考えると、これは

providers: [
  { provide: FOO, useClass: Bar, multi: true },
  { provide: FOO, useClass: Baz, multi: true }
]

FOO注入された依存関係を、このトークンに割り当てられた複数のプロバイダーの配列にします。つまり、次のものと同じです。

providers: [
  { provide: FOO, useValue: [Bar, Baz] }
]

違いは、マルチプロバイダーは同じインジェクターの複数の場所で定義でき、すべての追加の{ provide: FOO, multi: true, ... }PushからFOO配列を実行します。

9
Estus Flask