2017-04-01 11 views
2

私はangular2の遅延読み込みと共有依存関係はthisの記事を使って学習しています。私は、遅延モジュールには独立した依存ツリーがあり、熱心なモジュールと同じサービスインスタンスを共有していないことを理解しました。角2遅延モジュールと共有モジュールシングルトン

遅延モジュールのインポートセクションからSharedModuleインポートを削除すると、動作が変更され、熱心なモジュールと遅延モジュールの間でシングルトンサービスが発生しました。

同じ共有サービスを再利用するためのドキュメントによれば、thisの記事に記載されているように、さらに多くのことが行われます。しかし、共有モジュール定義からインポートを取り除くだけで動作させることができます。誰かがここでは、この動作

を説明することができplnkr

@NgModule({ 
    imports: [ 
    //SharedModule //This is removed 
    routing 
    ], 
    declarations: [LazyComponent] 
}) 
+0

私はあなたを説明することができます。あなたのすべての質問をリストアップ – Aravind

+0

私の質問は、私が他の記事の手順に従わなかったのに、なぜ動作しているのですか?つまり、共有モジュールを.forRoot()としてインポートしなかったのです。 – Sridhar

答えて

6

レイジーローディングは別の依存関係ツリーを作成しませんされて - 少なくとも、ではないあなたが記述しているように。

ご存じのように、Angularの依存性注入システムは、実際にはインジェクタのツリーです(ビュー階層内の各コンポーネントごとに1つ)。依存関係を要求すると、Angularはこの依存関係を要求しているコンポーネントから、その依存関係を提供できる最初のインジェクタを見つけるまで、このインジェクタのツリーを表示します。 これは、コンポーネントツリーの任意のレベルで、コンポーネントへの依存関係のプロバイダを指定し、そのコンポーネントにその依存関係の独自のインスタンスを持たせることができるため、必要に応じて多くの機能を提供します。さらに、そのコンポーネントのすべての子も、その依存関係の同じインスタンスを共有します。

これは、階層依存性注入がコンポーネントに関してどのように機能するかの基本的な概要です。しかし、モジュールに関しては、状況は少し異なります。デフォルトでは、NgModuleによって提供されるすべての依存関係がルートインジェクタに追加されます。つまり、その依存関係の単一のインスタンスがアプリケーション全体で共有されます。例外は、NgModuleが遅延ロードされている場合です。その場合、遅延読み込みモジュールによって提供される依存関係はルートインジェクタに追加されません。代わりに、それらの依存関係は、遅延ロードされたモジュールのルートコンポーネントに追加されます(私はこれを難しい方法で学びました - あなたの遅延ロードされたモジュールの複数のルートコンポーネントがある場合、それぞれの 'ルートコンポーネント'依存)。

これは基本的な階層構造ですが、ロードされたモジュールがルートインジェクタに依存関係を追加するのに対して、レイジーロードモジュールはルートモジュールにルート要素を追加するだけです。さらに、遅延ロードされたモジュールが(例えばあなたのSharedModuleのような)依存関係をも提供するNgModuleをインポートする場合、それらの依存関係もモジュールのそのルートコンポーネントに追加されます。 (SharedModuleも熱心に読み込まれている場合は、その依存関係もルートインジェクタに追加され、それらの依存関係の複数のインスタンスが利用可能になります)。

最後の点は、あなたが見ている動作を見ている理由です。 lazyモジュールがSharedModuleをインポートすると、SharedModules提供の依存関係が遅延モジュールのルートコンポーネントに追加され、それらの依存関係のインスタンスが重複します。

+0

偉大な答えです。ちなみに、実用的な観点からは、サービスが常に熱心に読み込まれた 'ngModule'によってロードされている場合、遅延ロードされたものにインポートする理由はありません。一方、あなたがあなたのサービスから州を守るならば、この問題はあなたに全く影響しません。 –

+1

@AluanHaddadサービスの状態を維持することについての非常に良い点。つまり、2つの異種コンポーネント間で状態共有メカニズムとしてサービスを使用していることが避けられないこともありますが、これはルールよりも例外です – snorkpete

関連する問題