webentwicklung-frage-antwort-db.com.de

Wie erhalte ich den letzten Wert, wenn ich ein Observable abonniere?

Ich habe zwei Angular2-Komponenten, die Daten über einen Dienst gemeinsam nutzen müssen:

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

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

Angenommen, ComponentA wird gerendert und sendet ein Ereignis über SearchService.setSearchResults. Anschließend navigiert der Benutzer zu ComponentB, das auch searchResult$ Abonniert. Allerdings wird ComponentB das von ComponentA ausgegebene Ereignis niemals beobachten, da es zum Zeitpunkt, als ComponentA ein Ereignis ausgegeben hat, nicht für searchResult$ Abonniert war, da dies nicht der Fall war existieren.

Wie kann ich ein Observable erstellen, das das letzte Ereignis an jeden neuen Abonnenten sendet?

29
kdu

BehaviorSubject gibt sofort den letzten Wert an neue Abonnenten aus:

@Injectable()
export class SearchService {

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

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

ReplaySubject sendet alle vorherigen Ereignisse an neue Abonnenten.

41

Sie können ReplaySubject verwenden, um immer den letzten Wert des Beobachters abzurufen.

@Injectable()
export class SearchService {

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

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

Und einfach wie gewohnt abonnieren.
Ein erweitertes Beispiel finden Sie hier: Caching-Ergebnisse mit angle2 http-Dienst

12
tibbus