如何制作Mat-tree组件Angular Material 6.0.1

时间:2018-09-30 14:21:51

标签: javascript angular angular-material

我正在尝试做一个基于材质角垫树的应用程序,但是当我运行此代码时,它不显示值,并且没有出现任何错误,我该如何解决呢?

打开应用程序时,我们需要显示班级名称

下面,我添加了我的html和组件代码

<mat-nested-tree-node *matTreeNodeDef="let node; when: hasNestedChild">
    <li>
      <div class="mat-tree-node">
        <button mat-icon-button matTreeNodeToggle
                [attr.aria-label]="'toggle ' + node.filename">
          <mat-icon class="mat-icon-rtl-mirror">
            {{nestedTreeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
          </mat-icon>
        </button>

      </div>
      <ul [class.example-tree-invisible]="!nestedTreeControl.isExpanded(node)">
        <ng-container matTreeNodeOutlet></ng-container>
      </ul>
    </li>
  </mat-nested-tree-node>

组件:

const TREE_DATA = [
{
    "class":"ece",
    "count":60,
    "students": [

            {"name":"a","id":"11"},
            {"name":"b","id":"12"},
            {"name":"c","id":"13"},
            {"name":"d","id":"14"}

    ]
},
{
    "class":"mech",
    "count":60,
    "students": [

            {"name":"r","id":"21"},
            {"name":"e","id":"22"},
            {"name":"w","id":"23"},
            {"name":"q","id":"24"}

    ]
}
];


@Injectable()
export class FileDatabase {
  dataChange = new BehaviorSubject<FileNode[]>([]);

  get data(): FileNode[] { return this.dataChange.value; }

  constructor() {
    this.initialize();
  }

  initialize() {

    const dataObject = TREE_DATA;


    const data = this.buildFileTree(dataObject, 0);


    this.dataChange.next(data);
  }


  buildFileTree(obj: object, level: number): FileNode[] {
    return Object.keys(obj).reduce<FileNode[]>((accumulator, key) => {
      const value = obj[key];
      const node = new FileNode();
      node.filename = key;

      if (value != null) {
        if (typeof value === 'object') {
          node.children = this.buildFileTree(value, level + 1);
        } else {
          node.type = value;
        }
      }

      return accumulator.concat(node);
    }, []);
  }
}

/**
 * @title Tree with nested nodes
 */
@Component({
  selector: 'tree-nested-overview-example',
  templateUrl: 'tree-nested-overview-example.html',
  styleUrls: ['tree-nested-overview-example.css'],
  providers: [FileDatabase]
})
export class TreeNestedOverviewExample {
  nestedTreeControl: NestedTreeControl<FileNode>;
  nestedDataSource: MatTreeNestedDataSource<FileNode>;

  constructor(database: FileDatabase) {
    this.nestedTreeControl = new NestedTreeControl<FileNode>(this._getChildren);
    this.nestedDataSource = new MatTreeNestedDataSource();

    database.dataChange.subscribe(data => this.nestedDataSource.data = data);
  }

  hasNestedChild = (_: number, nodeData: FileNode) => !nodeData.type;

  private _getChildren = (node: FileNode) => node.children;
}

这是我的demo

打开页面时,它应该是这样

enter image description here

当我单击ece时,它应该像这样

enter image description here

1 个答案:

答案 0 :(得分:0)

它在{{node:json}}下面添加了内容,您只需要从node对象中获取正确的数据即可。

    <button mat-icon-button matTreeNodeToggle
            [attr.aria-label]="'toggle ' + node.filename">
      <mat-icon class="mat-icon-rtl-mirror">
        {{nestedTreeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
      </mat-icon>
      {{node | json}}
    </button>