2016-07-18 4 views
1

EventEmitter<any>@Outputのコンポーネントがあります。ボタンをクリックした後に関数内で.emit()を呼び出すと出力が機能します。その場合、親コンポーネントのイベントを問題なく捕捉できます。しかし、それは本当にテストの手段と同じです。私が実際にやりたいこと、つまりデータベース呼び出しを行い、成功した場合にイベントを発行しようとすると、イベントは子コンポーネントから放出されたり、親コンポーネントで捕捉されることはありません。ここで私が何を意味するかを示すために、コードを少しです:角2 EventEmitterの問題

testOutput() { 
    this.outputEvent.emit({event: 'buttonClick', message: 'Here is some output'}); 
} 

makeAnUpdate(form) { 
    this._service.makeDbCall(data).subscribe(result => { 
     this.variable = result; 
     this.outputEvent.emit({ message: 'Here is a message to pass', success: true }); 
    }); 
} 

は私もちょうど下記の機能の購読一部内部からイベントを発する機能を呼び出すために試みたが、それはまだ動作しませんでした:

makeAnUpdate(form) { 
    this._service.makeDbCall(data).subscribe(result => { 
     this.variable = result; 
     this.testOutput(); 
    }); 
} 

他に誰かがこの問題を抱えていますか?ここでも、上記のtestOutput関数は、呼び出すと機能しますが、makeAnUpdate関数の内部からは機能しません。

+1

「this._service.makeDbCall(data)」が何も見ずに分かりません。 'subscribe(...)'に渡されたコールバックが呼び出されないと仮定します。 –

+0

それが呼び出されます。呼び出しはデータベースに行われ、その関数に戻ります。私はそこにあるイベントエミッタの前に 'console.log'を置くと' console.log'が動作して表示されるので、私は確信しています。 – pjlamb12

+0

私は実行がどうにかしてAngularsゾーンを離れると仮定します。私は答えを追加します。 –

答えて

1

makeDbCallから返されるobservableのコールバックは、Angularsゾーン外で実行される可能性があります。試してみてください

class MyComponent { 
    constructor(private zone:NgZone) {} 
    makeAnUpdate(form) { 
    this._service.makeDbCall(data).subscribe(result => { 
     this.zone.run(() => { 
      this.variable = result; 
      this.outputEvent.emit({ message: 'Here is a message to pass', success: true }); 
     }); 
    }); 
    } 
} 
+0

これは、 'ngZone.run'なしの場合と同じ効果があります。 'console.log'が表示され、データベースからデータが戻ってきますが、イベントは出力されません。 – pjlamb12

+0

伝えるのは難しいです。間違ってしまうことはあまりありません。私は、イベントを聴いてイベントを発生させるコンポーネントがどのように関係しているのか、メソッドとイベントハンドラがどこにあり、どのように呼び出されているのかを示すより完全な例が必要だと思います。 –

+0

実際のファイルと同じように設定されたサンプルファイルがある[要点](https://gist.github.com/pjlamb12/c3f6633008093eb268fd5b2f618c0934)です。これは本当に簡単です。私はおそらく他にどんな情報を提供できるのか分かりません。 – pjlamb12