2017-07-27 5 views
2

私は私のメインコンポーネントにイベントを放出していますでのイベントにサブスクライブ:角度4発光および共有サービス

main.component.ts

ここ
this.sharedService.cartData.emit(this.data); 

である私のsharedService.ts

私の他の(サブ)コンポーネントで
import { Component, Injectable, EventEmitter } from '@angular/core'; 
export class SharedService { 
    cartData = new EventEmitter<any>(); 
} 

は、私は、この値にアクセスしたいのですが、どういうわけか、サブスクリプションが動作しません:

ダッシュボード.ts

private myData: any; 

constructor(private sharedService: SharedService) { 
    this.sharedService.cartData.subscribe(
     (data: any) => myData = data, 
     error => this.errorGettingData = <any>error, 
     () => this.aggregateData(this.myData)); 
} 

私に何か不足していますか?データを注入可能なものとして渡すとうまく動作します。 イベントを(主要コンポーネント内で)放出することは、いくつかのREST呼び出しの後に起こります。

*************アップデート*************** 問題は、サブコンポーネントが最初の放出後に作成されることですイベントの私はこの場合、データを直接サブコンプリートに注入するほうがよいと思います。

+1

どこsharedServiceを提供していますか?サービスのインスタンスが同じではない可能性があります。異なるモジュールでサービスを提供すると起こります。 –

+0

親app.module.tsプロバイダで宣言しました。[SharedService ...]、 – Stef

+0

、どちらのコンポーネントも同時にロードされていますか?異なるルートでは? –

答えて

3

私は上で提供したコードを使用して作業中のサンプルを作成しました。 https://plnkr.co/edit/LS1uqB?p=preview

import { Component, NgModule, Injectable, EventEmitter, AfterViewInit } from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 


@Injectable() 
export class SharedService { 
    cartData = new EventEmitter<any>(); 
} 

@Component({ 
    selector: 'app-app', 
    template: ` 
    <h1> 
     Main Component <button (click)="onEvent()">onEvent</button> 
    </h1> 
    <p> 
     <app-dashboard></app-dashboard> 
    </p> 
    `, 
}) 
export class App implements AfterViewInit { 
    data: any = "Shared Data"; 

    constructor(private sharedService: SharedService) { 
    } 

    ngAfterViewInit() { 
    this.sharedService.cartData.emit("ngAfterViewInit: " + this.data); 
    } 

    onEvent() { 
    this.sharedService.cartData.emit("onEvent: " + this.data); 
    } 
} 

@Component({ 
    selector: 'app-dashboard', 
    template: ` 
    <h2> 
     Dashboard component 
    </h2> 
    <p> 
     {{myData}} 
    </p> 
    `, 
}) 
export class AppDashboard implements AfterViewInit { 
    myData: any; 

    constructor(private sharedService: SharedService) { 
      this.sharedService.cartData.subscribe(
      (data: any) => { 
      console.log(data); 
      this.myData = data; 
      }); 
    } 

} 


@NgModule({ 
    imports: [ BrowserModule ], 
    declarations: [ App, AppDashboard ], 
    providers: [ SharedService ], 
    bootstrap: [ App ] 
}) 
export class AppModule {} 

ビューのライフサイクルフックここhttps://angular.io/guide/lifecycle-hooks

+0

クリックリスナーで動作するので、これはうまくいきます。私は自分のコードでイベントを発生させるときにどの機能を使用しなければならないのか把握しようとしています。 – Stef

+0

これは、角度ライフサイクルのフックの一部であるngAfterViewInitでも動作します。チェックアウトhttps://angular.io/guide/lifecycle-hooks –

+0

私はngAfterViewInitに私のバージョンを変更し、どこかをクリックすると動作します。最初にアプリケーションがロードされると、サブコンポーネントは、main.component.htmlで宣言しているため、最初のイベントが発生した後に読み込まれます。1)Emitting Event 2)ダッシュボードコンストラクタ 3)ダッシュボードAfterViewInit – Stef

関連する問題