TL; DR :
No, no se suscriba manualmente a ellos, no los use en los servicios. Úselos como se muestra en la documentación solo para emitir eventos en los componentes. No vencer la abstracción angular.
Responder:
No, no debes suscribirte manualmente.
EventEmitter es una abstracción angular2 y su único propósito es emitir eventos en componentes. Citando un comentario de Rob Wormald
[...] EventEmitter es realmente una abstracción angular, y debe usarse prácticamente solo para emitir eventos personalizados en componentes. De lo contrario, solo use Rx como si fuera cualquier otra biblioteca.
Esto se afirma realmente claro en la documentación de EventEmitter.
Uso por directivas y componentes para emitir eventos personalizados.
¿Qué hay de malo en usarlo?
Angular2 nunca nos garantizará que EventEmitter continuará siendo un Observable. Eso significa refactorizar nuestro código si cambia. La única API a la que debemos acceder es su emit()
método. Nunca debemos suscribirnos manualmente a un EventEmitter.
Todo lo mencionado anteriormente es más claro en el comentario de Ward Bell (recomendado para leer el artículo y la respuesta a ese comentario). Citando para referencia
¡NO cuente con que EventEmitter continúe siendo un Observable!
¡NO cuente con que los operadores Observables estarán allí en el futuro!
Estos serán obsoletos pronto y probablemente eliminados antes del lanzamiento.
Use EventEmitter solo para el enlace de eventos entre un componente secundario y uno primario. No te suscribas a él. No llame a ninguno de esos métodos. Solo llamareve.emit()
Su comentario está en línea con el comentario de Rob hace mucho tiempo.
Entonces, ¿cómo usarlo correctamente?
Simplemente utilícelo para emitir eventos desde su componente. Eche un vistazo al siguiente ejemplo.
@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!
}
}
¿Cómo no usarlo?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Detente ahí ... ya estás equivocado ...
Esperemos que estos dos ejemplos simples aclaren el uso adecuado de EventEmitter.