TL; DR:
いいえ、手動でサブスクライブしたり、サービスで使用したりしないでください。ドキュメントに示されているようにそれらを使用して、コンポーネントでイベントを発行します。Angularの抽象化を無効にしないでください。
回答:
いいえ、手動でサブスクライブしないでください。
EventEmitterはangular2抽象化であり、その唯一の目的はコンポーネントでイベントを発行することです。Rob Wormaldからのコメントの引用
[...] EventEmitterは実際にはAngularの抽象概念であり、コンポーネントでカスタムイベントを発行する場合にのみ使用する必要があります。それ以外の場合は、Rxを他のライブラリと同じように使用します。
これは、EventEmitterのドキュメントで本当に明確に述べられています。
ディレクティブとコンポーネントで使用して、カスタムイベントを発行します。
それを使用することの何が問題になっていますか?
Angular2は、EventEmitterが引き続きObservableであることを保証しません。つまり、コードが変更された場合にコードをリファクタリングすることです。アクセスする必要がある唯一のAPIはそのemit()
メソッドです。EventEmitterを手動でサブスクライブしないでください。
上記のすべては、このワードベルのコメントでより明確です(記事とそのコメントへの回答を読むことをお勧めします)。参考のために引用
EventEmitterが引き続き監視可能であることを期待しないでください!
これらのObservableオペレーターが将来そこにいると期待しないでください!
これらは間もなく非推奨となり、リリース前に削除される可能性があります。
子コンポーネントと親コンポーネント間のイベントバインディングにのみEventEmitterを使用します。購読しないでください。これらのメソッドを呼び出さないでください。電話するだけeve.emit()
彼のコメントはずっと前のロブのコメントと一致しています。
それで、それを適切に使用する方法は?
これを使用して、コンポーネントからイベントを発行します。次の例を見てください。
@Component({
selector : 'child',
template : `
<button (click)="sendNotification()">Notify my parent!</button>
`
})
class Child {
@Output() notifyParent: EventEmitter<any> = new EventEmitter();
sendNotification() {
this.notifyParent.emit('Some value to send to the parent');
}
}
@Component({
selector : 'parent',
template : `
<child (notifyParent)="getNotification($event)"></child>
`
})
class Parent {
getNotification(evt) {
// Do something with the notification (evt) sent by the child!
}
}
どうやってそれを使わないのですか?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
すぐに止めて...あなたはすでに間違っています...
うまくいけば、これらの2つの簡単な例がEventEmitterの適切な使用法を明確にするでしょう。