TL; DR :
Nie, nie subskrybuj ich ręcznie, nie używaj ich w usługach. Używaj ich, jak pokazano w dokumentacji, tylko do emitowania zdarzeń w komponentach. Nie pokonuj abstrakcji kątowej.
Odpowiedź:
Nie, nie powinieneś subskrybować go ręcznie.
EventEmitter to abstrakcja kątowa2, której jedynym celem jest emitowanie zdarzeń w komponentach. Cytując komentarz Roba Wormalda
[...] EventEmitter jest tak naprawdę abstrakcją kątową i powinien być używany prawie wyłącznie do emitowania niestandardowych zdarzeń w komponentach. W przeciwnym razie po prostu użyj Rx, jakby to była jakakolwiek inna biblioteka.
Stwierdzono to bardzo wyraźnie w dokumentacji EventEmitter.
Używaj przez dyrektywy i komponenty do emitowania niestandardowych zdarzeń.
Co jest złego w korzystaniu z niego?
Angular2 nigdy nie zagwarantuje nam, że EventEmitter będzie nadal obserwowalny. Oznacza to przefaktoryzowanie naszego kodu, jeśli się zmieni. Jedynym API, do którego musimy uzyskać dostęp, jest jego emit()
metoda. Nigdy nie powinniśmy subskrybować ręcznie EventEmitter.
Wszystkie powyższe stwierdzenia są bardziej jasne w komentarzu Warda Bella (zalecane, aby przeczytać artykuł i odpowiedź na ten komentarz). Cytowanie w celach informacyjnych
NIE licz na to, że EventEmitter będzie nadal obserwowalny!
NIE licz na to, że w przyszłości pojawią się obserwowalni operatorzy!
Zostaną one wkrótce wycofane i prawdopodobnie zostaną usunięte przed wydaniem.
EventEmitter należy używać tylko do wiązania zdarzeń między komponentem podrzędnym i nadrzędnym. Nie subskrybuj tego. Nie wywołuj żadnej z tych metod. Tylko zadzwońeve.emit()
Jego komentarz jest zgodny z komentarzem Roba dawno temu.
Jak więc właściwie go używać?
Po prostu użyj go, aby emitować zdarzenia ze swojego komponentu. Spójrz na następujący przykład.
@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!
}
}
Jak tego nie używać?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Zatrzymaj się tutaj ... już się mylisz ...
Mamy nadzieję, że te dwa proste przykłady wyjaśnią prawidłowe użycie EventEmitter.