TL; DR :
Nein, abonnieren Sie sie nicht manuell, verwenden Sie sie nicht in Diensten. Verwenden Sie sie wie in der Dokumentation gezeigt nur, um Ereignisse in Komponenten auszugeben. Besiege nicht die Abstraktion von Angular.
Antworten:
Nein, Sie sollten es nicht manuell abonnieren.
EventEmitter ist eine Angular2-Abstraktion, deren einziger Zweck darin besteht, Ereignisse in Komponenten auszugeben. Zitiert einen Kommentar von Rob Wormald
[...] EventEmitter ist wirklich eine Angular-Abstraktion und sollte so ziemlich nur zum Ausgeben von benutzerdefinierten Ereignissen in Komponenten verwendet werden. Andernfalls verwenden Sie Rx einfach so, als wäre es eine andere Bibliothek.
Dies wird in der Dokumentation von EventEmitter sehr deutlich.
Wird von Anweisungen und Komponenten verwendet, um benutzerdefinierte Ereignisse auszugeben.
Was ist falsch daran?
Angular2 wird uns niemals garantieren, dass EventEmitter weiterhin ein Observable ist. Das bedeutet also, unseren Code zu überarbeiten, wenn er sich ändert. Die einzige API, auf die wir zugreifen müssen, ist ihre emit()
Methode. Wir sollten einen EventEmitter niemals manuell abonnieren.
Alle oben genannten Punkte sind in diesem Kommentar von Ward Bell klarer (empfohlen, den Artikel und die Antwort auf diesen Kommentar zu lesen ). Zitat als Referenz
Verlassen Sie sich NICHT darauf, dass EventEmitter weiterhin ein Observable ist!
Verlassen Sie sich NICHT darauf, dass diese Observable-Operatoren in Zukunft da sind!
Diese werden bald veraltet sein und wahrscheinlich vor der Veröffentlichung entfernt.
Verwenden Sie EventEmitter nur für die Ereignisbindung zwischen einer untergeordneten und einer übergeordneten Komponente. Abonnieren Sie es nicht. Rufen Sie keine dieser Methoden auf. Nur anrufeneve.emit()
Sein Kommentar stimmt mit Robs Kommentar vor langer Zeit überein.
Also, wie man es richtig benutzt?
Verwenden Sie es einfach, um Ereignisse von Ihrer Komponente auszusenden. Schauen Sie sich das folgende Beispiel an.
@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!
}
}
Wie man es nicht benutzt?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Halt genau dort an ... du liegst schon falsch ...
Hoffentlich verdeutlichen diese beiden einfachen Beispiele die ordnungsgemäße Verwendung von EventEmitter.