observables - que es un observable angular
¿Cómo obtener el último valor al suscribirse a un observable? (2)
Tengo dos componentes Angular2 que necesitan compartir datos a través de un servicio:
@Injectable()
export class SearchService {
private searchResultSource = new Subject<string>()
searchResult$ = this.searchResultSource.asObservable()
setSearchResults(_searchResult: string): void {
this.searchResultSource.next(_searchResult)
}
}
Supongamos que ComponentA
se representa y emite un evento a través de SearchService.setSearchResults
. Luego, el usuario navega a ComponentB
, que también se suscribe a searchResult$
. Sin embargo, ComponentB
nunca observará el evento emitido por ComponentA
porque no estaba suscrito a searchResult$
en el momento en que ComponentA
emitió un evento, ya que no existía.
¿Cómo puedo crear un Observable
que emita el último evento a cada nuevo suscriptor?
Puedes usar ReplaySubject para obtener siempre el último valor del Observer, algo como esto:
@Injectable()
export class SearchService {
private searchResultSource = new ReplaySubject<string>(1);
setSearchResults(_searchResult: string): void {
this.searchResultSource.next(_searchResult);
}
}
Y solo suscríbete como de costumbre.
Puede encontrar un example más avanzado aquí: example
BehaviorSubject
emite inmediatamente el último valor a los nuevos suscriptores:
@Injectable()
export class SearchService {
private searchResultSource = new BehaviorSubject<string>('''');
setSearchResults(_searchResult: string): void {
this.searchResultSource.next(_searchResult);
}
}
ReplaySubject
emite todos los eventos anteriores a los nuevos suscriptores.