TL; DR :
No, non iscriverti manualmente a loro, non utilizzarli nei servizi. Usali come mostrato nella documentazione solo per emettere eventi nei componenti. Non sconfiggere l'astrazione di Angular.
Risposta:
No, non dovresti iscriverti manualmente ad esso.
EventEmitter è un'astrazione angolare2 e il suo unico scopo è quello di emettere eventi nei componenti. Citando un commento di Rob Wormald
[...] EventEmitter è in realtà un'astrazione angolare e dovrebbe essere usata praticamente solo per emettere eventi personalizzati nei componenti. Altrimenti, usa Rx come se fosse qualsiasi altra libreria.
Questo è affermato chiaramente nella documentazione di EventEmitter.
Utilizzare da direttive e componenti per emettere eventi personalizzati.
Cosa c'è di sbagliato nell'usarlo?
Angular2 non ci garantirà mai che EventEmitter continuerà a essere osservabile. Quindi questo significa refactoring del nostro codice se cambia. L'unica API a cui dobbiamo accedere è il suo emit()
metodo. Non dovremmo mai abbonarci manualmente a un EventEmitter.
Tutto quanto detto sopra è più chiaro nel commento di Ward Bell (si consiglia di leggere l'articolo e la risposta a quel commento). Citando per riferimento
NON contare su EventEmitter che continua a essere osservabile!
NON contare su quegli operatori osservabili presenti in futuro!
Questi saranno presto deprecati e probabilmente rimossi prima del rilascio.
Utilizzare EventEmitter solo per l'associazione di eventi tra un componente figlio e genitore. Non abbonarti. Non chiamare nessuno di questi metodi. Chiama soloeve.emit()
Il suo commento è in linea con quello di Rob molto tempo fa.
Quindi, come usarlo correttamente?
Usalo semplicemente per emettere eventi dal tuo componente. Dai un'occhiata al seguente esempio.
@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!
}
}
Come non usarlo?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Smetti proprio lì ... ti sbagli già ...
Speriamo che questi due semplici esempi chiariscano il corretto utilizzo di EventEmitter.