2016-05-11 21 views
8

Ho due componenti Angular2 che hanno bisogno di condividere i dati tramite un servizio:Come ottenere l'ultimo valore quando si sottoscrive un Osservabile?

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

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

Supponiamo ComponentA è resa ed emette un evento tramite SearchService.setSearchResults. Quindi l'utente passa a ComponentB, che si abbona anche a searchResult$. Tuttavia, ComponentB non osserverà mai l'evento emesso da ComponentA perché non è stato sottoscritto a searchResult$ al momento ComponentA emesso un evento, poiché non esisteva.

Come è possibile creare un Observable che emette l'ultimo evento per ogni nuovo utente?

risposta

18

BehaviorSubject emette immediatamente l'ultimo valore ai nuovi abbonati:

@Injectable() 
export class SearchService { 

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

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

ReplaySubject emette tutti gli eventi precedenti per i nuovi abbonati.

6

È possibile utilizzare il ReplaySubject per ottenere sempre l'ultimo valore della Observer, qualcosa di simile:

@Injectable() 
export class SearchService { 

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

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

E basta iscriversi come normale.
una più avanzata example può essere trovato qui: caching results with angular2 http service

+0

Puoi spiegare "Iscriviti come normale"? C'è qualche caso in cui l'abbonamento non funziona? – sabithpocker

+0

Intendo dire che non ho bisogno di mostrare come ti iscrivi a questo ReplaySubject, dato che non devi fare nulla di speciale sul lato dell'abbonamento, basta iscriverti e otterrai l'ultimo valore. – tibbus

+0

Ok, va bene. Avevo una situazione in cui la sottotabella "BehaviorSubject" non funzionava ma "ReplaySubject" lo faceva. Stavo cercando di capire perché. – sabithpocker

Problemi correlati