TL; DR :
Non, ne vous y abonnez pas manuellement, ne les utilisez pas dans les services. Utilisez-les comme indiqué dans la documentation uniquement pour émettre des événements dans les composants. Ne battez pas l'abstraction angulaire.
Répondre:
Non, vous ne devez pas vous y abonner manuellement.
EventEmitter est une abstraction angular2 et son seul but est d'émettre des événements dans les composants. Citant un commentaire de Rob Wormald
[...] EventEmitter est vraiment une abstraction angulaire, et devrait être utilisé à peu près uniquement pour émettre des événements personnalisés dans les composants. Sinon, utilisez simplement Rx comme s'il s'agissait d'une autre bibliothèque.
Ceci est indiqué très clairement dans la documentation d'EventEmitter.
Utilisez des directives et des composants pour émettre des événements personnalisés.
Quel est le problème de l'utiliser?
Angular2 ne nous garantira jamais qu'EventEmitter continuera d'être un observable. Cela signifie donc refactoriser notre code s'il change. La seule API à laquelle nous devons accéder est sa emit()
méthode. Nous ne devons jamais souscrire manuellement à un EventEmitter.
Tout ce qui précède est plus clair dans ce commentaire de Ward Bell (recommandé de lire l'article et la réponse à ce commentaire). Citation pour référence
Ne comptez PAS sur EventEmitter pour continuer à être observable!
Ne comptez PAS sur la présence future de ces opérateurs observables!
Ceux-ci seront bientôt obsolètes et probablement supprimés avant la publication.
Utilisez EventEmitter uniquement pour la liaison d'événements entre un composant enfant et parent. Ne vous y abonnez pas. N'appelez aucune de ces méthodes. Appeler seulementeve.emit()
Son commentaire est conforme au commentaire de Rob il y a longtemps.
Alors, comment l'utiliser correctement?
Utilisez-le simplement pour émettre des événements à partir de votre composant. Jetez un œil à l'exemple suivant.
@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!
}
}
Comment ne pas l'utiliser?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Arrêtez-vous là ... vous avez déjà tort ...
Espérons que ces deux exemples simples clarifieront l'utilisation appropriée d'EventEmitter.