サービスを介してデータを共有する必要がある2つの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);
}
}
そして、通常どおり購読するだけです。
より高度な 例 はここにあります: angular2 httpサービスでのキャッシュ結果