Существует ли официальное соглашение о передаче данных от самого нижнего компонента в стеке вложенных компонентов?Я придерживаюсь соглашения умного родителя, глупого ребенка, и у меня возникают проблемы с выбором между тем, чтобы внук передавал его родителю, а родитель - бабушке и дедушке, а не просто с помощью службы.Я не решаюсь использовать службу, потому что компоненты связаны между собой, и я хочу избежать чрезмерного загрязнения моих служб темами.
Я понимаю, что лучше всего сохранять структуру папок как можно более плоской, а вложенные компоненты должныпо возможности избегать, но в моем конкретном случае имеет смысл иметь его в глубину 3.
Вариант 1: Внук до бабушки и дедушки
Служба <- Бабушка и дедушка <- Родитель <- Бабушка </p>
grandchild.component.ts
saveFormValues() {
this.eventEmitter.emit(this.myForm.value);
}
parent.component.html
<app-grandchild (eventEmitter)=relayFormValues($event)></app-grandchild>
parent.component.ts
relayFormValues(values) {
this.relayEvent.emit(values)
}
grandparent.compent.html
<app-parent (relayEvent)=saveChanges($event)></app-parent>
grandparent.component.ts
saveChanges(values) {
this.myService.save(values).subscribe(() => {...});
}
Вариант 2
Служба <- Дедушка <- Служба <- Внук </p>
myservice.service.ts
formSaveEventSource = new Subject<any>;
formSaveEvent$ = this.formSaveEventSource.asObservable();
...
saveFormEvent(values) {
this.formSaveEventSource.next(values)
}
save(values) {
// http request
}
grandchild.component.ts
saveFormValues() {
this.myService.saveFormEvent(this.myForm.value);
}
grandparent.component.ts
this.formSaveSub = this.myService.formSaveEvent$.subscribe(data => {
this.saveChanges(data);
});
...
this.saveChanges(data) {
this.myService.save(data).subscribe(() => {...})
}
Я склоняюсь в сторону выбораIon 1 с реле Eventemitter, потому что с опцией 2 мы вызываем службу дважды.Опять же, просто проверяю, есть ли официальное соглашение или я просто переосмысливаю это.Официальные документы , кажется, говорят только о родителе и ребенке, но не более уровней, чем это.