2016-10-10 10 views
6

私は1つのコンポーネントしか持っていないので、別のモジュールにある別のコンポーネントにデータを渡したい。実際に私のapp.componentは、これらの子モジュールの親です。そして、私はそれぞれの子モジュールがいくつかのデータをapp.componentに送ることを望みます。しかし、彼らはルーティングの意味でのみ子供と親です。だから彼らは実際には親や子供ではないと私は思う。私が意味する角度2の異なるモジュールコンポーネント通信

は、app.componentのための私のテンプレットは、次のようになります。

<div class="navbar-collapse collapse"> 
    <ul class="nav navbar-nav navbar-left"> 
     <li><a routerLink="link1" routerLinkActive="active">Page1</a></li> 
     <li><a routerLink="link2" routerLinkActive="active">Page2</a></li> 
     <li><a routerLink="link3" routerLinkActive="active">Page3</a></li> 
     <li><a routerLink="link4" routerLinkActive="active">Page4</a></li> 
    </ul> 
    </div> 
</nav> 
<div *ngIf="needsSidebar" id="sidebar">some content</div> 
<div> 
    <router-outlet></router-outlet> 
</div> 

のでapp.componentは、これらのモジュールおよび彼らのコンポーネントとは直接接続されていません。私はOutputを使用しようとしましたが、コンポーネントは異なるモジュールからのものであり、失敗しました。私は何をすべきかで迷っています。サイドバーが必要な場合はサイドバーが必要かどうか、サイドバーに表示する必要があるかどうかを知るために、「子供」モジュールがapp.moduleまでデータを送信するようにします。どうしたらいいですか?

答えて

6

モジュールがどのように関連しているかは関係ありません。重要なのは、コンポーネントがコンポーネントビュー内の子である場合です。この場合、Angularsバインディング構文を使用できます。それ以外の場合は、共有サービスを使用します。詳細については、https://angular.io/docs/ts/latest/cookbook/component-communication.html

を参照してください。共有サービスをプロバイダとして追加する場合も重要です。それをコンポーネントに追加すると、このコンポーネントのインスタンスと子と子孫だけがこのサービスインスタンスを共有します。 @NgModule()のプロバイダにサービスを追加すると、1つのインスタンスがアプリケーション全体と共有されます(レイジーでないモジュールの場合)。

+0

出力と角綴じを使用しようとしましたが、私のhtmlにセレクタがありません。ちょうど 'router-outlet'があります。どうすればそのイベントを渡すことができますか? 'zone.js:355 Unhandled Promise拒否:テンプレート解析エラー: 'child-selector'は既知の要素ではありません:' –

+0

子コンポーネントは次のようにする必要があります。 NgModule'が 'declarations:[]'にある 'exports:[]'に追加され、現在の 'NgModule'は' imports:[] 'に他のモジュールを持つ必要があります。そして、 ''で束縛するとうまくいくはずです。ルータによって追加されたコンポーネントの場合、バインドのサポートはありません。この場合は、共有サービスを使用する必要があります。 –

+2

ありがとう、私は、共有サービスは私のためだと思います。 –

1

このシナリオでは、sharedModuleをご覧ください。 SharedModuleservices,pipes & etcは、異なるモジュール/コンポーネントで利用したいと考えています。

関連する問題