2

I have object somethig like this:

{
 id: 1,
 text: "Main",
 childText: [
   {
    id: 3,
    text: "Child 1",
    childText: [
      {
        id: 5,
        text: "child 2"
        childText: [
        ....
        ]
      }
    ]
   }
 ]    
}

Any object can have childText any idea how to display this?

Vladimir Djukic
  • 2,042
  • 7
  • 29
  • 60
  • http://stackoverflow.com/questions/38821475/recursive-component-loading-with-recursive-array/38822751#38822751, http://stackoverflow.com/questions/37746516/use-component-in-itself/37747022#37747022, http://stackoverflow.com/questions/35707464/inject-parent-component-of-the-same-type-as-child-component/35707578#35707578 – Günter Zöchbauer Dec 04 '16 at 14:15

1 Answers1

5

You should use a self-referencing component to do that:

@Component({
  selector: 'app-tree-view',
  templateUrl: './tree-view.component.html',
  styleUrls: ['./tree-view.component.css']
})
export class TreeViewComponent implements OnInit {
    @Input() data: {children: Array<any>,name: string,id: number};
    showChildren: boolean;
}

In tree-view.component.html:

<ul class="office-list-unstyled" *ngIf="data">
  <li [ngClass]="{'office-parent': d.children.length && !showChildren,'office-child': d.children.length && showChildren}"
  *ngFor="let d of data.children">
    <span (click)="toggleOffices(d)">{{d.name}}</span>
    <app-tree-view *ngIf="d.children.length && showChildren" [data]="d"></app-tree-view>
  </li>
</ul>

Note that, *ngIf in the view is the thing to stop the loop. And then you can use it in another component:

<app-tree-view [data]="offices"></app-tree-view>

Offices is your initial data for example.

soroush gholamzadeh
  • 2,616
  • 1
  • 22
  • 30