2017-08-14 22 views
3

他のモジュールに公開するコンポーネントをエクスポートするモジュールがあります。このコンポーネントを別のモジュールの子モジュールに使用したいのですが、最初のモジュールを親モジュールを使用して子モジュールの内部で使用できるようにしていますが、それを実行する最善の方法であると完全にはわかっていません。子モジュール内にインポートされたモジュールのコンポーネントを使用する

これは私が使用したいコンポーネントを持つルートフォルダ内の私の共有モジュール:

アプリ/共有/ shared.module.ts

import {dtComponent} from './dt.component'; 

@NgModule({ 
    imports: [ 
    CommonModule 
    ], 
    exports: [ 
    dtComponent 
    ], 
    declarations: [ 
    dtComponent 
    ] 
}) 
export class DatePModule{ } 

私はappフォルダ内の別のモジュールを持っていますこのようなことインポートDatePModule

アプリ/連絡先/ contacts.module.ts

import {DatePModule} from '../shared/shared.module.ts'; 

@NgModule({ 
    imports: [ 
    CommonModule, 
    DatePModule 
    ] 
}) 
export class CTModule{ } 

私はCTModuleのいくつかのコンポーネントに直接dtComponentを使用する必要がなく、CTModuleの子モジュールである他のコンポーネントでこのコンポーネントを必要とします。

私はCTModuleの子モジュールの内部で再びDatePModuleをインポートし、それを行うことができますが、私はそれが最善のアプローチであると確信していないです。

アプリは/連絡先/その他/ other.module.ts

import {DatePModule} from '../../shared/shared.module.ts'; 

@NgModule({ 
    imports: [ 
    CommonModule, 
    DatePModule 
    ] 
}) 
export class OtherModule{ } 

私の質問ですが、私はすでに親モジュールにインポートされた場合には、再度DatePModuleインポートする必要がありますなぜですか?このインポートを削除した場合OtherModuleコンポーネントdtComponentはモジュールの一部として認識されません。

+0

遅延読み込みを使用していますか? –

+0

@ Maximusはい私はすべてのモジュールとコンポーネントをロードするために遅延読み込みを使用しています – xzegga

+0

まあ、私の答えはまだ関連しています、共有され、遅延ロードされたモジュールがマージされ、 –

答えて

2

私はすでに 親モジュールに

をインポートする場合は、互いににインポートするモジュールの間には階層がありません再びDatePModuleをインポートする必要がある理由。すべてのモジュールは、すべてのコンポーネントを含む1つのモジュール定義ファクトリに統合されます。レイジーローディングを使用する場合でも、同じことが適用されます。遅延ロードされたモジュールと共有モジュールはマージされ、それらの間に階層はありません。

詳しくはAvoiding common confusions with modules in Angularをご覧ください。

モジュールでimportsに関する最大の混乱は 開発者は、それが階層構造を作ると考えていることである:ここで引用です。そしておそらく、他のモジュールをインポートするモジュールがそのインポート用の親モジュール になると仮定するのは、おそらく妥当なのです。 しかし、それは何が起こるかではありません。すべてのモジュール は、コンパイル時にマージされます。したがって、非遅延ロードモジュール は階層を作成しません。

しかし、モジュールimports/exportsは、コンパイル時に申告種類のカプセル化を強制することができます。別のモジュールの宣言型を使用する場合は、このモジュールまたは必要なモジュールを再エクスポートする他のモジュールを明示的にインポートする必要があります。コンパイラは、テンプレートの解析時にカプセル化を制御し、明示的なインポートによって、特定のコンポーネントをテンプレート内の子として使用できるかどうかを示すコンテキストを提供します。

私は CTModuleの子モジュールの内部で再びDatePModuleをインポートし、それを行うことができますが、私はそれが最善のアプローチであると確信していないです。あなたはOtherModuleDatePModuleから申告タイプを使用したい場合は、正しいアプローチである

関連する問題