forRoot
メインアプリモジュールにのみ使用されます。これは、アプリ モジュールのみがアプリケーション/シングルトン プロバイダーを取得するために使用される規則です。これは、シングルトンであるはずのプロバイダがアプリケーションに対して複数回作成されるのを避けるためです。例えば
import { ModuleWithProviders } '@angular/core';
@NgModule({
declarations: [ SomeDirective ],
exports: [ SomeDirective ]
})
export class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [ AuthProvider ]
}
}
}
ここでは、シングルトンとして一度だけforRoot
作成できるように、アプリ モジュールへのインポート中にのみ呼び出す必要があります。を必要AuthProvider
とする他のすべてのモジュールは、.SharedModule
ShareModule
SharedDirective
そのため、 app モジュールを呼び出すforRoot
と、そのモジュール (および通常は の呼び出しに付属するプロバイダーforRoot
) によって提供されるすべてのものを app モジュールに取得します。したがって、アプリ モジュールで宣言されたすべてのコンポーネントは、そのモジュールのすべてにアクセスできます。
ただし、declarations
(コンポーネント、ディレクティブ、およびパイプを含む) のすべては、どのサブモジュールにも継承されません。そのため、モジュールを必要とする他のモジュールにモジュールをインポートする必要があります。
あなたの質問は、特にあなたのShareModule
. このモジュールでは、forRoot
上記の理由から を使用しないでください。exports
MDモジュールのみを使用する必要があります。で宣言されたコンポーネントが実際に MD モジュールを必要とするimports
場合にのみ使用します。SharedModule
たとえば、MD ボタンを使用するコンポーネントがあり、そのコンポーネントが で宣言する共有コンポーネントであるとしますSharedModule
。この場合、 と を実行する必要がimports
ありexports
ます。ただし、そのようなコンポーネントがない場合は、必要なのはexports
. これにより、インポート先のモジュールに MD モジュールが提供SharedModule
されます。