Я создал аккордеонный компонент Angular 7 Пример SlackBlitz :
export class AccordionComponent {
@ContentChildren(PanelComponent) panels: QueryList<PanelComponent>;
ngAfterContentInit() {
this.panels.forEach((panel) => {panel.active = false;});
}
}
PanelComponent выглядит следующим образом:
export class PanelComponent {
@Input() active: boolean;
@Input() title: string;
toggle() {
this.active = !this.active;
}
}
Аккордеон работает, но мне нужнозакрыть все панели при открытии новой.
Я думаю, что это можно сделать двумя способами:
В PanelComponent есть возможность доступа к методу в AccordionComponent.
Этот метод сделает одну панель активной, а остальные - неактивной.
Я не знаю, как получить доступ к родительскому компоненту (аккордеону) из дочернего компонента (панели)
Используйте AccordionService, который будет содержать Панели:
panels: PanelComponent[] = [];
Затем добавьте этот сервис в Accordion and Panel.
Это выглядит логично, но затем я перестал использовать @ContentChildren (PanelComponent).
В некотором смысле это нарушает связь между Аккордеоном и Панелью.
Какое решение мне следует использовать?Или другое?
Я что-то упустил в своих 2 решениях (я не знаю, как реализовать решение 1).