我有两个需要通过服务共享数据的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
发出的事件,因为它在searchResult$
发布事件时没有订阅ComponentA
,因为它不存在。
如何创建一个Observable
,它向每个新订阅者发送最后一个事件?
BehaviorSubject
立即向新订阅者发出最后一个值:
@Injectable()
export class SearchService {
private searchResultSource = new BehaviorSubject<string>('');
setSearchResults(_searchResult: string): void {
this.searchResultSource.next(_searchResult);
}
}
ReplaySubject
向新订阅者发送所有先前的事件。
您可以使用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