如何从主题中获取最后一个值?
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
向新订阅者发送所有以前的事件。
我有两个需要通过服务共享数据的 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);
}
}
并且只需正常订阅即可。
更高级的
BehaviorSubject
立即将最后一个值发送给新订阅者:
@Injectable()
export class SearchService {
private searchResultSource = new BehaviorSubject<string>('');
setSearchResults(_searchResult: string): void {
this.searchResultSource.next(_searchResult);
}
}
ReplaySubject
向新订阅者发送所有以前的事件。