我有两个需要通过服务共享数据的Angular2组件:
1
假设呈现@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
发出的事件,因为它searchResult$
在ComponentA
发出事件时没有订阅,因为它不存在。
如何创建Observable
向每个新订阅者发送最后一个事件?
答案 0 :(得分:36)
BehaviorSubject
会立即向新订阅者发送最后一个值:
@Injectable()
export class SearchService {
private searchResultSource = new BehaviorSubject<string>('');
setSearchResults(_searchResult: string): void {
this.searchResultSource.next(_searchResult);
}
}
ReplaySubject
向新订阅者发送所有先前的事件。
答案 1 :(得分:11)
您可以使用ReplaySubject始终获取Observer的最后一个值,如下所示:
@Injectable()
export class SearchService {
private searchResultSource = new ReplaySubject<string>(1);
setSearchResults(_searchResult: string): void {
this.searchResultSource.next(_searchResult);
}
}
只是正常订阅。
可以在此处找到更高级的example:caching results with angular2 http service