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