import {FlatTreeControl} from '@angular/cdk/tree'; import {Component} from '@angular/core'; import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree'; /** * Food data with nested structure. * Each node has a name and an optiona list of children. */ interface FoodNode { name: string; children?: FoodNode[]; } const TREE_DATA: FoodNode[] = [ { name: 'Fruit', children: [ {name: 'Apple'}, {name: 'Banana'}, {name: 'Fruit loops'}, ] }, { name: 'Vegetables', children: [ { name: 'Green', children: [ {name: 'Broccoli'}, {name: 'Brussel sprouts'}, ] }, { name: 'Orange', children: [ {name: 'Pumpkins'}, {name: 'Carrots'}, ] }, ] }, ]; /** Flat node with expandable and level information */ interface ExampleFlatNode { expandable: boolean; name: string; level: number; } /** * @title Tree with flat nodes */ @Component({ selector: 'tree-flat-overview-example', templateUrl: 'tree-flat-overview-example.html', styleUrls: ['tree-flat-overview-example.css'], }) export class TreeFlatOverviewExample { private _transformer = (node: FoodNode, level: number) => { return { expandable: !!node.children && node.children.length > 0, name: node.name, level: level, }; } treeControl = new FlatTreeControl( node => node.level, node => node.expandable); treeFlattener = new MatTreeFlattener( this._transformer, node => node.level, node => node.expandable, node => node.children); dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); constructor() { this.dataSource.data = TREE_DATA; } hasChild = (_: number, node: ExampleFlatNode) => node.expandable; }