TL;DR :
いいえ、手動でサブスクライブしないでください。サービスで使用しないでください。ドキュメントに示されているように、コンポーネントでイベントを発行するためにのみ使用してください。angularの抽象化を無効にしないでください。
答え:
いいえ、手動で購読しないでください。
EventEmitterは angular2 の抽象化であり、その唯一の目的はコンポーネントでイベントを発行することです。Rob Wormald からのコメントの引用
[...] EventEmitter は実際には Angular の抽象化であり、ほとんどの場合、コンポーネントでカスタム イベントを発行するためにのみ使用する必要があります。それ以外の場合は、他のライブラリであるかのように Rx を使用してください。
これは、EventEmitter のドキュメントで明確に述べられています。
ディレクティブおよびコンポーネントで使用して、カスタム イベントを発行します。
使って何が悪い?
Angular2 は、EventEmitter が引き続き Observable であることを保証しません。つまり、コードが変更された場合はコードをリファクタリングするということです。アクセスする必要がある唯一の API は、そのemit()
メソッドです。EventEmitter を手動でサブスクライブするべきではありません。
上記のすべては、この Ward Bell のコメントでより明確になります (記事とそのコメントへの回答を読むことをお勧めします)。参考までに引用
EventEmitter が Observable であり続けることに期待しないでください。
これらの 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 の適切な使用法が明確になることを願っています。