TL; DR :
Não, não se inscreva manualmente, não os use nos serviços. Use-os conforme mostrado na documentação apenas para emitir eventos nos componentes. Não derrote a abstração da angular.
Responda:
Não, você não deve se inscrever manualmente.
EventEmitter é uma abstração angular2 e seu único objetivo é emitir eventos nos componentes. Citando um comentário de Rob Wormald
[...] EventEmitter é realmente uma abstração Angular e deve ser usado praticamente apenas para emitir eventos personalizados nos componentes. Caso contrário, use Rx como se fosse qualquer outra biblioteca.
Isto é afirmado de forma clara na documentação do EventEmitter.
Use por diretivas e componentes para emitir eventos personalizados.
O que há de errado em usá-lo?
A Angular2 nunca nos garantirá que o EventEmitter continuará sendo um Observável. Isso significa refatorar nosso código se ele mudar. A única API que devemos acessar é seu emit()
método. Nunca devemos assinar manualmente um EventEmitter.
Tudo o que foi dito acima é mais claro no comentário de Ward Bell (recomendado para ler o artigo e a resposta a esse comentário). Citando para referência
NÃO conte com o EventEmitter continuando sendo um Observável!
NÃO conte com esses operadores observáveis no futuro!
Estes serão descontinuados em breve e provavelmente serão removidos antes do lançamento.
Use EventEmitter apenas para associação de eventos entre um componente filho e pai. Não assine. Não chame nenhum desses métodos. Ligar apenaseve.emit()
Seu comentário está alinhado com o comentário de Rob há muito tempo.
Então, como usá-lo corretamente?
Basta usá-lo para emitir eventos do seu componente. Veja o exemplo a seguir.
@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!
}
}
Como não usá-lo?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Pare aí ... você já está errado ...
Esperamos que esses dois exemplos simples esclareçam o uso adequado do EventEmitter.