プロバイダーは別のクラスからサービスを取得することを理解していますが、マルチプロバイダーとトークンとは何ですか?
また、multi=true
?
provide(NG_VALIDATORS, { useExisting: class), multi: true })
_multi: true
_は、1つのプロバイダートークンが要素の配列を提供することを意味します。たとえば、ルーターサポートのすべてのディレクティブrouterLink
、_router-outlet
_は、_ROUTER_DIRECTIVES
_によって提供されます。
新しいプロバイダーがトークン_ROUTER_DIRECTIVES
_で登録されている場合、以前に登録されたディレクティブをオーバーライドします。 _multi: true
_(最初に登録されたand新しいプロバイダーで)が設定されている場合、新しいディレクティブはオーバーライドする代わりに、以前に登録されたディレクティブに追加されます。
_ROUTER_DIRECTIVES
_が挿入されると(constructor(@Inject(ROUTER_DIRECTIVES) directives) {}
)、ディレクティブインスタンスの配列が挿入されます。通常、_ROUTER_DIRECTIVES
_を挿入しても意味がありません。 _multi: true
_であるため、例として使用しました。
multi: true
を使用すると、Angularプロバイダーがマルチプロバイダーであることを示します。前述のように、マルチプロバイダーでは、DIの単一トークンに複数の値を提供できます。
使用法:
コンポーネントデコレーションで定義することなく、アプリケーション全体で自動的に使用できるディレクティブがいくつかある場合は、マルチプロバイダーを利用して、PLATFORM_DIRECTIVES
に注入されるものを拡張することでそれを行うことができます。
@Directive(...)
class Draggable { }
@Directive(...)
class Morphable { }
@Component(...)
class RootCmp { }
そして
// at bootstrap
bootstrap(RooCmp, [
provide(PLATFORM_DIRECTIVES, {useValue: Draggable, multi: true}),
provide(PLATFORM_DIRECTIVES, {useValue: Morphable, multi: true})
]);
ドキュメントから:
同じトークンに一致する複数のプロバイダーを作成します(マルチプロバイダー)。マルチプロバイダーは、プラグ可能なサービスの作成に使用されます。システムには、いくつかのデフォルトプロバイダーが付属しており、ユーザーは追加のプロバイダーを登録できます。デフォルトのプロバイダーと追加のプロバイダーの組み合わせは、システムの動作を駆動するために使用されます。