代码之家  ›  专栏  ›  技术社区  ›  BobtheMagicMoose

角度6材质树

  •  2
  • BobtheMagicMoose  · 技术社区  · 7 年前

    我正在尝试做一个基于 docs 但似乎遇到了一个我无法诊断的错误。Chromes给出了一个错误 Cannot read property 'children' of undefined 在HTML的第8行。看起来好像树被加载到 nestedDataSource 很好,但不会显示任何内容。不可否认,我不完全确定角度材质树是如何工作的,所以我可能只是把HTML弄乱了。

    角度6.01

    类别选取器.component.html:

    <mat-tree [dataSource]="nestedDataSource" [treeControl]="nestedTreeControl" class="category-picker">
      <mat-tree-node *matTreeNodeDef="let node">
        <li class="mat-tree-node">
          {{node.category.name}}
        </li>
      </mat-tree-node>
    
      <mat-nested-tree-node *matTreeNodeDef="let node; when: node.children.length">
        <li>
          {{node.category.name}}
          <ul [class.example-tree-invisible]="!nestedTreeControl.isExpanded(node)">
            <ng-container matTreeNodeOutlet></ng-container>
          </ul>
        </li>
      </mat-nested-tree-node>
    </mat-tree>
    

    类别选择器.component.ts:

    import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
    import {NestedTreeControl} from '@angular/cdk/tree';
    
    import {MatSelectModule} from '@angular/material';
    import {MatTreeNestedDataSource} from '@angular/material/tree';
    
    import { DataBrokerService } from '../data-broker.service';
    import { Category } from '../datatypes'
    import { observable, of } from 'rxjs';
    
    export class CategoryNode {
      children: CategoryNode[];
      category: Category;
    }
    
    
    @Component({
      selector: 'app-category-picker',
      templateUrl: './category-picker.component.html',
      styleUrls: ['./category-picker.component.scss']
    })
    export class CategoryPickerComponent implements OnInit {
    
      // Does not follow main/sub category - just has a simple category!
      @Input() categoryID: number;
      @Output() categoryIDChange:EventEmitter<number> = new EventEmitter<number>();
    
      nestedTreeControl: NestedTreeControl<CategoryNode>;
    
      nestedDataSource: MatTreeNestedDataSource<CategoryNode>;
    
      constructor(
        private dataBrokerService: DataBrokerService
      ) { 
        this.nestedTreeControl = new NestedTreeControl(node => of(node.children));
        this.nestedDataSource = new MatTreeNestedDataSource();
      }
    
      ngOnInit() {
        this.dataBrokerService.getCategories().subscribe(categories => this.nestedDataSource.data = this.buildTree(categories));
      }
    
      onChange(){
        this.categoryIDChange.emit(this.categoryID);
      }
    
      private buildTree(categories:Category[]):CategoryNode[]{
        console.log("tree");
    
        let tree:CategoryNode[] = [];
        let map: {[s:number]: CategoryNode} = {};
    
        // Build an index of the nodes
        categories.forEach(cat => {
          map[cat.id] = {children:[], category:cat};
        });
    
        // Start adding nodes to tree 
        for (let key of Object.keys(map)){
          let catNode = map[+key];
    
          if (map[catNode.category.parent_id]){
            // Add it to the parent
            map[catNode.category.parent_id].children.push(catNode);
          }
          else{
            // Add it to root
            tree.push(catNode);
          }
        };
        console.log(tree);
        return tree;
      }
    }
    
    2 回复  |  直到 7 年前
        1
  •  6
  •   BobtheMagicMoose    7 年前

    结果发现我错误地执行了 when '的功能 MatTreeNodeDef 。在HTML中,我需要更改 when: node.children.length when: hasNestedChild 定义为 = (_: number, nodeData) => {return nodeData.children.length} 在.ts文件中。换句话说, 什么时候? 是接受函数的必需参数 输入(数字和节点)。

        2
  •  0
  •   Adnan Cindioglu    7 年前

    类别选取器.component.html: <mat-nested-tree-node *matTreeNodeDef="let node; when: hasNestedChild">

    类别选择器.component.ts: hasNestedChild=(_: number, nodeData) => {return nodeData.children.length}

    推荐文章