Я программирую приложение Angular, которое взаимодействует с REST-подобным бэкэндом.
Пользовательский интерфейс состоит из главной страницы / страницы сведений, где элемент выбирается слева, а детали отображаются справа. Использование углового маршрутизатора, розетки маршрутизатора и т. Д.
Выбираемые позиции показывают сводку деталей. Когда подробный элемент редактируется, я хочу обновить выбранный элемент обновленной информацией.
У меня есть сервис API, который использует HttpClient для получения значений из бэкэнда.
api.service.ts
public getAllItems(): Observable<Item[]> {
return this.http.get<Item[]>(this.apiUrl + '/items')
.map(response => {
return response.map((item) => new Item(item));
});
}
У меня также есть служба данных, которая в настоящее время просто возвращает наблюдаемое из службы API.
предметы-data.service.ts
get items$(): Observable<Item[]> {
return this.api.getAllItems();
}
Главный (левый) компонент просто регистрирует наблюдаемую службу данных.
Пункт-master.component.ts
data$: Observable<Item[]>;
constructor(private itemsDataService: ItemsDataService) { }
ngOnInit() {
this.data$ = this.itemsDataService.items$;
}
Шаблон использует асинхронный канал и выполняет итерацию массива для отображения сводки.
Пункт-master.component.html
<div *ngIf="(data$ | async) as data">
При использовании этого метода выбираемый элемент не обновляется автоматически при обновлении элемента в приложении.
Теперь я рассматриваю возможность изменения службы данных таким образом, чтобы у меня был внутренний субъект, который можно наблюдать. Когда обновление выполняется с помощью метода в службе данных, я могу вызвать subject.next (), чтобы сообщить об изменении. НО это приложение одновременно используется другими людьми на других машинах / в браузерах.
В идеале я хотел бы повторно получить данные из бэкэнда, но субъект будет эффективно действовать как «кеш», вызывая только первый вызов API. Как наиболее эффективно убедиться, что я получаю самые последние данные из серверной части, а также получаю обновления от изменений, внесенных локально?