Следуя решению @Noelmout, но получая более простой способ.
Идея состоит в том, чтобы установить рекурсивный компонент.
Поскольку набор данных, который вы только что показали, удовлетворяет шаблону типа {prop1: "", prop2: "", child: [...]}
и скоро. Рассмотрим компонент для рекурсивного и типизированного рендеринга.
*. Ts
type Item = {
prop1: string,
prop2: string,
child: Item[];
}
@Component({
selector: 'item-display',
templateUrl: './item-display.html',
styleUrls: ['./item-display.component.scss']
})
export class ItemDisplayComponent {
@Input() item: Item;
}
*. html
<div class="content">
<div class="prop1">{{ item.prop1 }}</div>
<div class="prop2">{{ item.prop2 }}</div>
<div class="child" *ngFor="let c of item.child">
<item-display [item]="c"></item-display>
</div>
</div>
Теперь вы можете изменить что-либо в компоненте который будет применяться ко всем вложенным компонентам.
Еще больше, добавьте атрибут depth
, если необходимо
...
@Input() depth: number = 0; // or 1, up to you
<item-display [item]="c" [depth]="depth + 1"></item-display>
И, наконец, поскольку у вас есть коллекция этих элементов, из вы root компонент
<div class="item-display" *ngFor="let item of rootItems">
<item-display [item]="item"></item-display>
</div>
Нет необходимости устанавливать свойство глубины, поскольку оно имеет значение по умолчанию (и лучше не раскрывать это свойство, оно похоже на внутреннее поле, известное только по * 1024) *).