如何从主题中获取最后一个值?

How to get last value from a Subject?

我有两个需要通过服务共享数据的 Angular2 组件:

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

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

假设 ComponentA 被渲染并且它通过 SearchService.setSearchResults 发出一个事件。然后用户导航到 ComponentB,它也订阅了 searchResult$。但是,ComponentB 永远不会观察到 ComponentA 发出的事件,因为它在 ComponentA 发出事件时没有订阅 searchResult$,因为它不存在。

我如何创建一个 Observable 向每个新订阅者发出最后一个事件?

您可以使用 ReplaySubject 始终获取观察者的最后一个值,如下所示:

@Injectable()
export class SearchService {

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

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

并且只需正常订阅即可。
更高级的 can be found here :

BehaviorSubject 立即将最后一个值发送给新订阅者:

@Injectable()
export class SearchService {

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

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

ReplaySubject 向新订阅者发送所有以前的事件。