Wiem, jak podnieść zdarzenie za pomocą EventEmitter. Mogę również dołączyć metodę do wywołania, jeśli mam taki komponent:
<component-with-event (myevent)="mymethod($event)" />
Kiedy mam taki komponent, wszystko działa świetnie. Przeniosłem trochę logiki do usługi i muszę wywołać zdarzenie z wnętrza usługi. Oto co zrobiłem:
export class MyService {
myevent: EventEmitter = new EventEmitter();
someMethodThatWillRaiseEvent() {
this.myevent.next({data: 'fun'});
}
}
Mam komponent, który musi zaktualizować jakąś wartość na podstawie tego zdarzenia, ale nie wydaje mi się, aby działał. Próbowałem tego:
//Annotations...
export class MyComponent {
constructor(myService: MyService) {
//myService is injected properly and i already use methods/shared data on this.
myService.myevent.on(... // 'on' is not a method <-- not working
myService.myevent.subscribe(.. // subscribe is not a method <-- not working
}
}
Jak sprawić, by MyComponent zasubskrybował zdarzenie, gdy usługa, która go zgłasza, nie jest składnikiem?
Jestem na 2.0.0-alpha.28
EDYCJA: Zmodyfikowałem mój „działający przykład”, aby faktycznie działał, więc można skupić się na niedziałającej części;)
Przykładowy kod: http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv
javascript
angular
Per Hornshøj-Schierbeck
źródło
źródło
Odpowiedzi:
Aktualizacja : znalazłem lepszy / właściwy sposób rozwiązania tego problemu za pomocą BehaviorSubject lub Observable, a nie EventEmitter. Zobacz tę odpowiedź: https://stackoverflow.com/a/35568924/215945
Ponadto dokumenty Angular mają teraz przykład książki kucharskiej, który używa tematu .
Oryginalna / nieaktualna / zła odpowiedź: znowu nie używaj EventEmittera w usłudze . To jest anty-wzór.
Używając beta.1 ... NavService zawiera EventEmiter. Nawigacja po komponentach emituje zdarzenia za pośrednictwem usługi, a komponent ObservingComponent subskrybuje zdarzenia.
nav.service.ts
komponenty.ts
Plunker
źródło
providers: [NavService]
? Jeśli tak, otrzymasz wiele wystąpień usługi.subscribe()
metodę. Korzystając z metody, możemy łatwo zmienić EventEmitter na Subject lub Observable, co jest znacznie lepsze, ponieważ teraz nauczyliśmy się, że EventEmitters powinny być używane tylko dla właściwości wyjściowych. Właściwym sposobem jest użycie obiektu Subject, BehaviorSubject lub Observable i zwykle bezpośrednio subskrybujemy te elementy, dlatego nie potrzebujemy już metody getNavChangeEmitter ().Używając alfa 28, zrealizowałem programową subskrypcję emiterów zdarzeń za pomocą
eventEmitter.toRx().subscribe(..)
metody. Ponieważ nie jest to intuicyjne, może ulec zmianie w przyszłej wersji.źródło
click.toRx().subscribe(your_callback_function)