TL; DR :
Hayır, onlara manuel olarak abone olmayın, hizmetlerde kullanmayın. Bunları yalnızca bileşenlerde olay yaymak için belgelerde gösterildiği gibi kullanın. Açısal soyutlamayı yenmeyin.
Cevap:
Hayır, manuel olarak abone olmamalısınız.
EventEmitter bir açısal2 soyutlamasıdır ve tek amacı bileşenlerdeki olayları yaymaktır. Rob Wormald'dan bir yorum alıntılama
[...] EventEmitter gerçekten Açısal bir soyutlamadır ve yalnızca bileşenlerde özel Olaylar yayınlamak için hemen hemen kullanılmalıdır. Aksi takdirde, Rx'i başka bir kütüphane gibi kullanın.
Bu olay EventEmitter'in belgelerinde çok açık bir şekilde ifade edilmiştir.
Özel Etkinlikler düzenlemek için yönergeler ve bileşenler tarafından kullanın.
Kullanmayla ilgili sorun nedir?
Angular2, EventEmitter'in Gözlemlenebilir olmaya devam edeceğini asla garanti etmeyecektir. Yani bu, kodumuzun değişmesi durumunda yeniden düzenlenmesi anlamına gelir. Erişmemiz gereken tek API emit()
yöntemi. Bir EventEmitter'a asla manuel olarak abone olmamalıyız.
Yukarıda belirtilenlerin hepsi bu Ward Bell'in yorumunda daha açıktır (makaleyi ve bu yorumun cevabını okumanız önerilir ). Referans için alıntı
Gözlemlenebilir olmaya devam eden EventEmitter'a güvenmeyin!
İleride orada olan Gözlemlenebilir operatörlere güvenmeyin!
Bunlar yakında kullanımdan kaldırılacak ve muhtemelen yayınlanmadan önce kaldırılacak.
EventEmitter öğesini yalnızca bir alt öğe ve üst bileşen arasındaki olay bağlama için kullanın. Abone olmayın. Bu yöntemlerden hiçbirini çağırma. Sadece araeve.emit()
Onun yorumu, Rob'un uzun zaman önce yaptığı yorumla aynı doğrultuda.
Peki, nasıl düzgün kullanılır?
Bileşeninizden etkinlik yayınlamak için kullanın. Aşağıdaki örneğe bir göz atın.
@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!
}
}
Nasıl kullanılmaz?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Orada dur ... zaten yanılıyorsun ...
Umarım bu iki basit örnek EventEmitter'ın uygun kullanımını açıklığa kavuşturacaktır.