2016-05-11 17 views
8

Ich habe zwei Angular2 Komponenten, die Daten über einen Service teilen müssen:Wie erhält man den letzten Wert beim Abonnieren eines Observable?

@Injectable() 
export class SearchService { 
    private searchResultSource = new Subject<string>() 
    searchResult$ = this.searchResultSource.asObservable() 

    setSearchResults(_searchResult: string): void { 
    this.searchResultSource.next(_searchResult) 
    } 
} 

Es sei ComponentA gemacht wird und es gibt ein Ereignis über SearchService.setSearchResults. Dann navigiert der Benutzer zu ComponentB, der auch searchResult$ abonniert. ComponentB wird jedoch niemals das von ComponentA ausgegebene Ereignis beobachten, da es searchResult$ zur Zeit ComponentA nicht signiert hatte, da ein Ereignis ausgegeben wurde, da es nicht existierte.

Wie kann ich eine Observable erstellen, die das letzte Ereignis an jeden neuen Teilnehmer sendet?

Antwort

18

BehaviorSubject emittiert sofort den letzten Wert an neue Abonnenten:

@Injectable() 
export class SearchService { 

    private searchResultSource = new BehaviorSubject<string>(1); 

    setSearchResults(_searchResult: string): void { 
     this.searchResultSource.next(_searchResult); 
    } 
} 

ReplaySubject emittiert alle Vorveranstaltungen um neue Abonnenten.

6

können Sie die ReplaySubject verwenden, um immer den letzten Wert des Beobachters zu bekommen, so etwas wie dieses:

@Injectable() 
export class SearchService { 

    private searchResultSource = new ReplaySubject<string>(1); 

    setSearchResults(_searchResult: string): void { 
     this.searchResultSource.next(_searchResult); 
    } 
} 

Und genauso normal abonnieren.
Eine fortgeschrittenere example sind hier zu finden: caching results with angular2 http service

+0

Können Sie "Abonnieren als normal" erklären? Gibt es einen Fall, in dem das Abonnement nicht funktioniert? – sabithpocker

+0

Ich meinte, dass ich nicht zeigen muss, wie Sie dieses ReplaySubject abonnieren, da Sie auf der Subskriptionsseite nichts besonderes tun müssen, einfach abonnieren und Sie erhalten den letzten Wert. – tibbus

+0

Okay, cool. Ich hatte eine Situation, in der 'BehaviorSubject' nicht funktioniert, aber' ReplaySubject'. Versuchte zu verstehen warum. – sabithpocker

Verwandte Themen