Это похоже на недопонимание того, как работают трубы.
Сравни
Подумайте о водопроводах.
Представьте, что вам нужен кран, чтобы налить сахарную воду.
Если вы возьмете стакан воды из-под крана и добавите в него сахар, вы больше не сможете снова заливать эту воду в кран.
Решением будет добавление куска трубы с система добавления сахара до того, как вы выпьете стакан воды.
rx js трубы такие же, как только вы подпишетесь, пути назад уже не будет. (если вы не создадите новую трубу и не нальете в нее воду;)
Решение состоит в том, чтобы все пускать по трубам. Только subscribe
, когда вы хотите получить значение. Это также повышает производительность.
Решение
this._cache$: BehaviorSubject<Section[]> = new BehaviorSubject<Section[]> ([]);
this.sections$: Observable<Section[]>;
loadPageData(id: number): void {
// subcribe once and save the values in the cache
this.fetchPageData(Id).subscribe(data => this._cache$.next(data));
// section$ will emit values when caché changes
this.sections$ = this._cache$.asObservable();
}
fetchPageData(Id): Observable<Section[]> {
// call your data service
return this.psService.getLoadPageData(Id).pipe(
//...
);
}
updateTable(sectionId, tablePerodID) {
let tableData;
this.psService.getTable(tablePerodID).subscribe((data) => {
tableData = data;
});
this.sections$ = this.sections$.pipe(
map(sections => sections.map(section =>
{
if (section.sectionID === sectionId) {
section.table = tableData;
}
})
);
}
Вместо подписки на наблюдаемое направьте операцию обновления.
updateTable
обновит sections$
наблюдаемый и html асинхронный c канал обновит результаты.
Использование _cache$
имеет другое улучшение производительности, поскольку каждый раз, когда вы обновляете канал, он не будет вызывать вашу службу данных. (Не обязательно использовать его)
Уточнение: это обновит ваш канал в вашем приложении, а не данные в базе данных или где-либо еще.