Я думаю, что один из способов решить эту проблему - использовать фасадный сервис.
chart.facade.ts
chartData$: Observable<any>;
loadChartData () {
this.chartData$ = this.http.get(...).pipe(shareReplay({ bufferSize: 1, refCount: true }));
}
parent.component.ts
ngOnInit () {
this.charFacade.loadChartData();
}
Теперь я бы сказал, что это зависит от того, как вы организовываете вещи, но, насколько я понимаю, каждый sample-component
будет делать вызов http самостоятельно.
sample.component.ts
// chartFacade.chartData$ - instantiated in `parent` component
this.chartData$ = this.chartFacade.chartData$;
constructor (private chartFacade: ChartFacade) { }
Каждый раз, когда вы делаете chartData$ | async
в шаблоне sample
компонента, вызов http должен выполняться только один раз, а результат должен извлекаться из кэша ReplaySubject
.
Когда refCount === true
, если нет активных подписок (например, уничтожен каждый sample
компонент), ReplaySubject
, используемый shareReplay
, будет отброшен, что означает, что при повторной загрузке этих компонентов произойдет HTTP-вызов , чей результат будет сохранен новым ReplaySubject
.
Вот разговор о Фасадах.