web-dev-qa-db-ja.com

angular2のマルチプロバイダーとは

プロバイダーは別のクラスからサービスを取得することを理解していますが、マルチプロバイダーとトークンとは何ですか?

また、multi=true

provide(NG_VALIDATORS, { useExisting: class),    multi: true })
24
blackHawk

_multi: true_は、1つのプロバイダートークンが要素の配列を提供することを意味します。たとえば、ルーターサポートのすべてのディレクティブrouterLink、_router-outlet_は、_ROUTER_DIRECTIVES_によって提供されます。
新しいプロバイダーがトークン_ROUTER_DIRECTIVES_で登録されている場合、以前に登録されたディレクティブをオーバーライドします。 _multi: true_(最初に登録されたand新しいプロバイダーで)が設定されている場合、新しいディレクティブはオーバーライドする代わりに、以前に登録されたディレクティブに追加されます。

_ROUTER_DIRECTIVES_が挿入されると(constructor(@Inject(ROUTER_DIRECTIVES) directives) {})、ディレクティブインスタンスの配列が挿入されます。通常、_ROUTER_DIRECTIVES_を挿入しても意味がありません。 _multi: true_であるため、例として使用しました。

28

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})
]);

詳細

5
Arpit Agarwal

ドキュメントから:

同じトークンに一致する複数のプロバイダーを作成します(マルチプロバイダー)。マルチプロバイダーは、プラグ可能なサービスの作成に使用されます。システムには、いくつかのデフォルトプロバイダーが付属しており、ユーザーは追加のプロバイダーを登録できます。デフォルトのプロバイダーと追加のプロバイダーの組み合わせは、システムの動作を駆動するために使用されます。

ソース

1
muetzerich