Я вызываю компонент рекурсивно аккордеоном, чтобы показать древовидную структуру.
Код работает для короткого ввода, но отстает от рекурсивных вызовов для вложенных данных
как дерево json.
//sample.component.html
<app-tree [input]="data"></app-tree>
//tree.component.html
<mat-accordion>
<mat-expansion-panel hideToggle="true" (click)="toggleTree($event, input)">
<mat-expansion-panel-header>
<mat-panel-title>
<mat-icon>{{input.buttonName}}</mat-icon>
{{input.key}}
</mat-panel-title>
</mat-expansion-panel-header>
<ul class="main-obj"> // tried *ngIf here
<div class="obj-list" *ngFor="let item of input.value; trackBy: trackChanges">
<li>
{{item.key}}: {{item.value}}
</li>
<li style="list-style: none; margin-left: -40px;">
<app-tree [input]="item"></app-tree>
</li>
</div>
</ul>
</mat-expansion-panel>
</mat-accordion>
//tree.component.ts
import { Component, OnInit, Input, Output } from '@angular/core';
import { EventEmitter } from 'events';
@Component({
selector: 'app-tree',
templateUrl: './tree.component.html',
styleUrls: ['./tree.component.css']
})
export class TreeComponent implements OnInit {
@Input() input: any;
@Output() click = new EventEmitter();
constructor(){}
ngOnInit(){
}
toggleTree(event, toggleButton) {
event.stopPropagation();
if(toggleButton.buttonName == 'add')
toggleButton.buttonName = 'remove';
else
toggleButton.buttonName = 'add';
};
trackChanges = (index) => {
return index;
}
}
Я пробовал разместить ngIf (как показано в коде перед ngFor), но это не так эффективно.
Есть ли способ загрузить компонент при открытии гармошки?
Спасибо!