16

Angular2 Materialの例を見ていきますforRoot()。メソッドを使用して、すべての Material モジュールがルート モジュールにインポートされていることがわかります。したがって、私のアプリでは同じことを行います。

ここで、他の共有モジュール内でいくつかのマテリアル コンポーネントを使用する必要があります。つまり、関連するマテリアル パッケージを共有モジュールにインポートする必要があります。forRoot()Shared モジュールにインポートするときにもメソッドを使用する必要があるかどうかはわかりません。

助けてくれてありがとう

4

1 に答える 1

47

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されます。

于 2016-09-23T16:59:21.757 に答える