Когда мы работаем с Angular и имеем «родительскую» и «дочернюю» модели данных, какую-то информацию обновление которых должна отражаться в «дочерней» модели, мы можем воспользоваться несколькими подходами.
- Передача данных через свойства:
- Создать свойство в компоненте «родителя» и привязать его к шаблону. Например,
parentData: string;
. - Создать свойство в компоненте «ребенка» и присвоить ему значение, пришедшее из «родителя». Например,
@Input() childData: string;
. - В «родительском» шаблоне передать значение на «ребенка» следующим образом:
<app-child [childData]="parentData"></app-child>
. - Вместилище данного значения будет реализовано с использованием директивы
@Input
компонента «ребенка». При обновленииparentData
в «родителе» это значение автоматически обновится и в «ребенке».
- Использование сервиса:
- Создать сервис и зарегистрировать его в основном модуле приложения (или в модуле компонентов, где происходит работа с данными).
- В сервисе создать свойство для хранения данных, и методы для получения и обновления этих данных.
- В компоненте «родителе» внедрить сервис и использовать его методы для обновления данных:
this.service.updateData(newData);
. - В компоненте «ребенке» также внедрить сервис и вызвать его методы для получения обновленных данных:
this.childData = this.service.getData();
.
- Использование BehaviorSubject:
- Создать новый
BehaviorSubject
в сервисе, который будет служить источником данных для «родителя» и «ребенка». - В «родительском» компоненте внедрить сервис и подписаться на изменения данных:
this.service.data.subscribe(updatedData => this.parentData = updatedData);
. При обновлении данных, значениеparentData
автоматически обновится. - В «ребенке» также внедрить сервис и подписаться на изменения данных:
this.service.data.subscribe(updatedData => this.childData = updatedData);
. При обновлении данных, значениеchildData
автоматически обновится.
- Использование событий:
- Создать событие в сервисе с помощью
EventEmitter
илиSubject
, которое будет генерироваться при обновлении данных. - В «родительском» компоненте подписаться на это событие:
this.service.dataUpdated.subscribe(updatedData => this.parentData = updatedData);
. - В компоненте «родителе» обновлять данные и вызывать событие при необходимости:
this.service.updateData(newData);
. - В компоненте «ребенке» также подписаться на событие:
this.service.dataUpdated.subscribe(updatedData => this.childData = updatedData);
.