web-dev-qa-db-ja.com

forRoot()を使用したモジュールのインポート

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

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

助けてくれてありがとう

14
Picci

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を使用しないでください。 MDモジュールをexportsするだけです。 importsで宣言されたコンポーネントが実際にMDモジュールを必要とする場合にのみ、SharedModuleを使用します。たとえば、MDボタンを使用するコンポーネントがあり、そのコンポーネントがSharedModuleで宣言する共有コンポーネントである場合。この場合、importsexportsを使用する必要があります。しかし、そのようなコンポーネントがない場合、必要なのはexportsだけです。これにより、SharedModuleをインポートするモジュールにMDモジュールが提供されます。

44
Paul Samsotha