TL; DR :
Tidak, jangan berlangganan secara manual kepada mereka, jangan menggunakannya dalam layanan. Gunakan mereka seperti yang ditunjukkan dalam dokumentasi hanya untuk memancarkan peristiwa dalam komponen. Jangan mengalahkan abstraksi sudut.
Menjawab:
Tidak, Anda tidak harus berlangganan secara manual.
EventEmitter adalah abstraksi angular2 dan satu-satunya tujuannya adalah untuk memancarkan peristiwa dalam komponen. Mengutip komentar dari Rob Wormald
[...] EventEmitter benar-benar abstraksi Angular, dan harus digunakan cukup banyak hanya untuk memancarkan Acara kustom dalam komponen. Kalau tidak, cukup gunakan Rx seolah-olah itu perpustakaan lain.
Ini dinyatakan sangat jelas dalam dokumentasi EventEmitter.
Gunakan dengan arahan dan komponen untuk memancarkan Acara kustom.
Apa yang salah dengan menggunakannya?
Angular2 tidak akan pernah menjamin kami bahwa EventEmitter akan terus menjadi Observable. Jadi itu berarti refactoring kode kita jika ada perubahan. Satu-satunya API yang harus kita akses adalah emit()
metodenya. Kita tidak boleh berlangganan secara manual ke EventEmitter.
Semua yang dinyatakan di atas lebih jelas dalam komentar Ward Bell ini (disarankan untuk membaca artikel, dan jawaban untuk komentar itu). Mengutip untuk referensi
JANGAN mengandalkan EventEmitter yang terus menjadi Observable!
JANGAN mengandalkan operator yang bisa diamati itu di masa depan!
Ini akan segera ditinggalkan dan mungkin dihapus sebelum rilis.
Gunakan EventEmitter hanya untuk pengikatan acara antara komponen anak dan orang tua. Jangan berlangganan untuk itu. Jangan panggil metode tersebut. Hanya panggilaneve.emit()
Komentarnya sudah sesuai dengan komentar Rob sejak dulu.
Jadi, bagaimana cara menggunakannya dengan benar?
Cukup gunakan untuk memancarkan acara dari komponen Anda. Lihatlah contoh berikut.
@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!
}
}
Bagaimana tidak menggunakannya?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Berhenti di sana ... Anda sudah salah ...
Semoga dua contoh sederhana ini akan menjelaskan penggunaan yang tepat dari EventEmitter.