2016-08-16 6 views
3

非常に単純な出力イベントとハンドラを持つ2つのコンポーネントがあり、子サブモジュールの値をapp.moduleのコンポーネントに渡そうとしています。ここで私は、次のコンポーネントが含まれてtutorialModuleをインポート私app.component.tsapp.module.tsng2サブモジュールのコンポーネントからイベントを出力()するには?

@Component({ 
    selector: 'my-app', 
    template: ` 
    <sidebar *ngIf="showHeader" (everySecond)="everySecond()" ></sidebar> 
    <navbar *ngIf="showHeader" (toggleNav)="toggleNav($event)"></navbar> 
    <router-outlet></router-outlet>`, 
    directives: [homeComponent, sidebarComponent, navbarComponent] 
}) 
export class AppComponent { 
    everySecond() { console.log('second'); } 
} 

です。

I tutorialComponentへのルート、私はtutorialComponentはの指示として宣言されていないため、これがあると仮定します。「here2ログがプリントアウトされますが、 『第二』 1がトリガされることはありませんが
export class tutorialComponent { 
    @Output() everySecond = new EventEmitter(); 

    constructor() { 
    this.everySecond.emit("event"); 
    console.log("here"); 
    } 
} 

、例えば

:app.component(それがモジュールとしてインポートされたように)どのように私はこの作業を取得ん

+1

"this.everySecond.emit(" event ")"をngOnInitメソッドに配置しようとしましたか? –

答えて

1

あなたはアプリのコンポーネントにeverySecondに加入する必要があります。?

this.tutorialComponent.everySecond.subscribe((data) => { 
    console.log('second'); 
}); 
+0

'this.tutorialComponent'はどこから来たのですか?現在のところ、コンポーネントにはモジュールのインポートでしか参照がありません。 –

0

コンストラクタでイベントを発行すると、まだデータバインディングが設定されていないため、イベントは潜在的な受信者に通知されません。 コードをngOnInit()に移動すると、の後にイベントが発行され、コンポーネントが初期化され、データバインディングが設定されます。

export class tutorialComponent { 
    @Output() everySecond = new EventEmitter(); 

    ngOnInit() { 
    this.everySecond.emit("event"); 
    console.log("here"); 
    } 
} 
+0

それでも私はコンソールに「ここ」が印刷されるのを恐れますが、「秒」はありません... –

+0

この単純なPlunkerで動作するようです –

+0

他の子コンポーネントではなくsubModuleを使用して、問題を軽減する(plunkで複製されない) –

関連する問題