私は次のような質問を読んだことがありますCustomHttp 内の EventEmitter サービスにアクセスするユーザーはサービスでEventEmitterを使用していますが、このコメントそれを使用せず、代わりにサービス内で Observables を直接使用します。
私もこれを読んだ質問ここでの解決策は、EventEmitter を子に渡してサブスクライブすることを提案しています。
そこで質問です。EventEmitter を手動でサブスクライブするべきでしょうか、それともしないべきでしょうか? どのように使用すればよいでしょうか?
ベストアンサー1
TL;DR :
いいえ、手動でサブスクライブしたり、サービスで使用したりしないでください。ドキュメントに示されているように、コンポーネントでイベントを発行するためだけに使用してください。Angular の抽象化を無効にしないでください。
答え:
いいえ、手動で購読しないでください。
イベントエミッターはAngular2の抽象化であり、その唯一の目的はコンポーネント内でイベントを発行することです。コメントロブ・ワーマルドより
[...] EventEmitter は実際には Angular の抽象化であり、コンポーネントでカスタム イベントを発行する場合にのみ使用する必要があります。それ以外の場合は、Rx を他のライブラリと同じように使用します。
これは、EventEmitter のドキュメントに明確に記載されています。
ディレクティブとコンポーネントを使用してカスタム イベントを発行します。
それを使用することの何が問題なのですか?
Angular2 では、EventEmitter が今後も Observable であり続けることは保証されません。したがって、変更があった場合はコードをリファクタリングする必要があります。アクセスする必要がある唯一の API はそのemit()
メソッドです。EventEmitter に手動でサブスクライブしないでください。
上記のすべては、このウォード・ベルのコメント(記事を読むことをお勧めします、そして答えそのコメントに。参考までに引用
EventEmitter が Observable であり続けることを期待しないでください。
これらの Observable 演算子が将来も存在すると期待しないでください。
これらはまもなく廃止され、リリース前に削除される可能性があります。
EventEmitterは、子コンポーネントと親コンポーネント間のイベントバインディングにのみ使用してください。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 の適切な使用方法が明確になると思います。