web-dev-qa-db-ja.com

NgModuleでforRootを使用する目的は何ですか?

NgModuleでforRootを使用する目的は何ですか?

AngularJS 1.xのプロバイダーと同じですか?

遅延読み込みでどのように重要な役割を果たしますか?

TIA。

28
Mantu Nigam

それはシングルトンに関係しています。 Angularサービスはページに1回(シングルトン)ロードされ、すべての参照はこの1インスタンスを指します。

遅延ロードされたモジュールがシングルトンである必要があるものの2番目のインスタンスを作成しようとするリスクがあり、forRoot()メソッドはアプリモジュール/共有モジュール/および遅延ロードされたモジュールがすべて使用することを保証する方法です同じ1インスタンス(ルートインスタンス)。

詳細情報のコピー元: Angular 2にコアシングルトンサービスモジュールを提供

最良のアプローチは、プロバイダーでモジュールを作成することです。サービスが共有モジュールにある場合、複数のインスタンスを取得する可能性があることに注意してください。次に、Module.forRootでモジュールを構成することをお勧めします。

慣例により、forRoot静的メソッドは、同時にサービスを提供および構成します。サービス構成オブジェクトを受け取り、ModuleWithProvidersを返します。

ルートアプリケーションモジュールであるAppModuleでのみforRootを呼び出します。他のモジュール、特に遅延ロードされたモジュールで呼び出すと、意図に反し、実行時エラーが発生する可能性があります。

結果をインポートすることを忘れないでください。他の@NgModuleリストに追加しないでください。

編集-コメントのコディーの質問に関して、ANGULARドキュメントに関する詳細情報を見つけてください。

モジュールがプロバイダーと宣言(コンポーネント、ディレクティブ、パイプ)の両方を提供する場合、ルートなどの子インジェクターにロードすると、プロバイダーインスタンスが複製されます。プロバイダーの複製は、ルートインスタンスをシャドウするため、おそらくシングルトンであるため、問題が発生します。このため、Angularは、プロバイダーをモジュールから分離し、プロバイダーのあるルートモジュールと、プロバイダーのない子モジュールに同じモジュールをインポートできるようにします。

モジュールで(慣例により)静的メソッドforRoot()を作成します。次のようにforRootメソッドにプロバイダーを配置します。これをより具体的にするために、例としてRouterModuleを検討してください。 RouterModuleは、RouterOutletディレクティブと同様に、ルーターサービスを提供する必要があります。アプリケーションにルーターがあり、アプリケーションに少なくとも1つのRouterOutletがあるように、RouterModuleはルートアプリケーションモジュールによってインポートする必要があります。また、RouteOutletディレクティブをサブルートのテンプレートに配置できるように、個々のルートコンポーネントによってインポートする必要があります。

RouterModuleにforRoot()がなかった場合、各ルートコンポーネントは新しいルーターインスタンスをインスタンス化し、ルーターは1つしか存在できないため、アプリケーションが破損します。このため、RouterModuleにはRouterOutlet宣言があるため、どこでも使用できますが、RouterプロバイダーはforRoot()にのみ存在します。その結果、ルートアプリケーションモジュールはRouterModule.forRoot(...)をインポートし、ルーターを取得しますが、すべてのルートコンポーネントはルーターを含まないRouterModuleをインポートします。

プロバイダーと宣言の両方を提供するモジュールがある場合、このパターンを使用してそれらを分離します。

29
JBoothUA

docs から

forRootは、すべてのディレクティブ、指定されたルート、ルーターサービス自体を含むモジュールを作成します。

hereから使用される理由について詳しく読むことができます

4

forRoot()は、アプリケーションの先頭にプロバイダーを注入するために使用されます。コンポーネントとディレクティブのインスタンスは、呼び出されるたびに新しいインスタンスが作成されます。 (forRoot()を使用して)アプリケーションのルートで同じことを言うと、インスタンスが1つだけ作成されます。

まず、プロバイダーにはコンポーネントやディレクティブが注入されるのとは多少の違いがあることを理解する必要があります。クラスに@Injectableアノテーションが付けられている場合、呼び出し時にこのクラスのインスタンスが1つだけ作成され、アプリケーション全体で共有されます。そのためには、クラスをNgModuleにインポートするときにthis(forRoot())メソッドを追加する必要があります。

あなたが今明確であることを願っています。

0
Nandha King

ルーティングモジュールを作成するにはtwo wayがあります。

RouterModule.forRoot(routes)

ルーターディレクティブ、ルート構成、およびルーターサービスを含むルーティングモジュールを作成します

RouterModule.forChild(routes)

ルーターディレクティブ、ルート構成を含むルーティングモジュールを作成しますではなくルーターサービス。アプリケーションに複数のルーティングモジュールがある場合、RouterModule.forChild()メソッドが必要です。

ルーターサービスは、アプリケーションの状態とブラウザーのURLとの間の同期を処理することに注意してください。同じブラウザURLと対話する複数のルーターサービスをインスタンス化すると問題が発生するため、アプリケーションにインポートするルーティングモジュールの数に関係なく、アプリケーションにルーターサービスのインスタンスが1つしかないことが不可欠です。

RouterModule.forRoot()を使用して作成されたルーティングモジュールをインポートすると、Angularはルーターサービスをインスタンス化します。 RouterModule.forChild()を使用して作成されたルーティングモジュールをインポートすると、Angularはルーターサービスをインスタンス化しません。

したがって、RouterModule.forRoot()は1回しか使用できず、追加のルーティングモジュールにはRouterModule.forChild()を複数回使用できます。

0
Saeb Panahifar