この記事を読むことを強くお勧めします。
プロバイダー付きモジュール
モジュールをインポートするときは、通常、モジュールクラスへの参照を使用します。
@NgModule({
providers: [AService]
})
export class A {}
-----------------------------------
@NgModule({
imports: [A]
})
export class B
このようにして、モジュールに登録されているすべてのプロバイダーA
がルートインジェクターに追加され、アプリケーション全体で使用できるようになります。
しかし、このようなプロバイダーにモジュールを登録する別の方法があります:
@NgModule({
providers: [AService]
})
class A {}
export const moduleWithProviders = {
ngModule: A,
providers: [AService]
};
----------------------
@NgModule({
imports: [moduleWithProviders]
})
export class B
これには、前のものと同じ影響があります。
おそらく、遅延ロードされたモジュールには独自のインジェクターがあることを知っています。したがってAService
、アプリケーション全体で使用できるように登録したいが、一部BService
は遅延ロードされたモジュールでのみ使用できるようにするとします。次のようにモジュールをリファクタリングできます:
@NgModule({
providers: [AService]
})
class A {}
export const moduleWithProvidersForRoot = {
ngModule: A,
providers: [AService]
};
export const moduleWithProvidersForChild = {
ngModule: A,
providers: [BService]
};
------------------------------------------
@NgModule({
imports: [moduleWithProvidersForRoot]
})
export class B
// lazy loaded module
@NgModule({
imports: [moduleWithProvidersForChild]
})
export class C
これでBService
、子の遅延読み込みモジュールでのみAService
使用可能になり、アプリケーション全体で使用できるようになります。
上記のように、次のようにエクスポートされたモジュールとして書き換えることができます。
@NgModule({
providers: [AService]
})
class A {
forRoot() {
return {
ngModule: A,
providers: [AService]
}
}
forChild() {
return {
ngModule: A,
providers: [BService]
}
}
}
--------------------------------------
@NgModule({
imports: [A.forRoot()]
})
export class B
// lazy loaded module
@NgModule({
imports: [A.forChild()]
})
export class C
それはどのようにRouterModuleに関連していますか?
同じトークンを使用して両方にアクセスするとします。
export const moduleWithProvidersForRoot = {
ngModule: A,
providers: [{provide: token, useClass: AService}]
};
export const moduleWithProvidersForChild = {
ngModule: A,
providers: [{provide: token, useClass: BService}]
};
token
遅延ロードされたモジュールから要求するときに個別の構成を使用するとBService
、計画どおりに取得できます。
RouterModuleはROUTES
トークンを使用して、モジュールに固有のすべてのルートを取得します。レイジーロードされたモジュールに固有のルートをこのモジュール(BServiceのアナログ)内で利用できるようにしたいので、レイジーロードされた子モジュールに異なる構成を使用します。
static forChild(routes: Routes): ModuleWithProviders {
return {
ngModule: RouterModule,
providers: [{provide: ROUTES, multi: true, useValue: routes}]
};
}