2017-01-25 17 views
7

Buduję usługę, która ujawnia obserwowalne. W tej usłudze otrzymuję zewnętrzne wywołania funkcji, które powinny wywoływać następne wywołanie w Obserwowalnym, aby różni konsumenci otrzymali zdarzenie subskrypcji. Podczas konstruktora Observer mogę zadzwonić dalej i wszystko działa świetnie, ale w jaki sposób mogę uzyskać dostęp do tego poza konstruktorem, aby zewnętrzne wyzwalacze mogły wywołać następne połączenia?Angular2 Observable - Jak zadzwonić dalej spoza konstruktora Observable

private myObservable$: Observable<any>; 

Podczas programu init usług robię

this.myObservable$ = new Observable(observer => { 
    observer.next("initial message"); 
} 

następnie w innych metodach tej samej usługi Chcę być w stanie wykonać coś

this.myObservable$.observer.next("next message"); 

Powyższe oczywiście nie działa , ale w jaki sposób mogę osiągnąć ten cel?

Jestem zakładając, że jestem brakuje czegoś podstawowego, ponieważ nie musi być jakiś sposób, aby emitować kolejne wiadomości poza początkowym konstruktora obserwowalnym za

Odpowiedz

9

Należy utworzyć Subject dla tego

this.myObservable$ = new Subject(); 

A potem można wywołać w dowolnym momencie:

this.myObservable$.next(...); 

Albo użyć subskrybować:

this.myObservable$.subscribe(...) 
+0

hah genialny, dzięki ! Wiedziałem, że brakuje mi czegoś podstawowego. Teraz działa jak zaklęcie ... –

2

dwa sposoby:

  1. Złóż myObservable $ publicznej:

    public myObservable$: Observable; 
    
  2. hermetyzacji obserwowalne w strumieniu przedmiotu oraz zapewnić pomocnika zadzwonić obok:

    export class TestService { 
        public myObservable$: Observable; 
        private _myObservableSubject: Subject; 
    
        constructor() { 
        this._myObservableSubject = new Subject(); 
        this.myObservable$ = this._myObservableSubject.asObservable(); 
        } 
    
        public NextMessage(message?: string): void { 
        this._myObservableSubject.next(message); 
        } 
    } 
    
+0

Dzięki Boyan, drugie wygląda na to, że zadziałało, ale zamierzam z odpowiedzią olsna powyżej, wydaje się dużo bardziej zwięzłe. –

+0

Oczywiście, mówimy o tym samym. Dostałem odpowiedź od czytania dokumentów Angular 2. W szczególności ta sekcja, https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service –

Powiązane problemy