2

我的 mat-table 工作正常,但是在按照官方 api 文档添加 mat-sort 时,它在 ngAfterViewInit 失败并显示以下消息

无法设置未定义的 aq LeadsComponent.push../src/app/leads/leads.component.ts.LeadsComponent.ngAfterViewInit 的属性“排序”

Mat-table Sorting Demo 上已经有一个 SO 帖子并尝试了它们,但我仍然无法使其正常工作。

有人能帮我解决这个问题吗?官方示例使用组件本身中定义的“静态”MatTableDataSource,但是我从后端查询。

MatSortModule 已经在 app.module.ts 中导入,mat-sort-header 指令应用于列,并且 ngAfterViewInit 已经与官方示例中的完全一样......

 export class LeadsComponent implements OnInit,AfterViewInit  {

  displayedColumns: string[] = ['name', 'leadStatus', 'mobile', 'email', 'actions'];
  dataSource: MatTableDataSource<LeadsChildObject>;
  @ViewChild(MatPaginator) paginator: MatPaginator;
  @ViewChild(MatSort) sort: MatSort;

  constructor(public dialog: MatDialog, private dashBoardService: LeadsService,
    private toast: ToastrService) {
  }

    ngAfterViewInit() {
        this.dataSource.sort = this.sort;
      }

      ngOnInit() {
        this.dashboardService.getFeedback.subscribe(
          res => {
            this.leadlist= res;
            this.dataSource = new MatTableDataSource(this.leadlist);
          }
        );
      }
    }
}
4

2 回答 2

4

无法设置未定义的 aq LeadsComponent.push../src/app/leads/leads.component.ts.LeadsComponent.ngAfterViewInit 的属性“排序”

此错误是指在未定义属性上调用“排序”,在您更新后,该属性是数据源属性,因为您没有对其进行初始化。

它没有被初始化,因为你的subscribe()(你初始化它的地方)是async,因此,初始化发生 ngAfterViewInit()发生之后。

请在你的初始化它ngOnInit()

ngOnInit() {
  // This line of code below:
  this.dataSource = new MatTableDataSource<LeadsChildObject>();

  this.dashboardService.getFeedback.subscribe(
    res => {
      this.leadlist= res;
      this.dataSource = new MatTableDataSource(this.leadlist);
      this.dataSource.sort = this.sort;
    }
  );
}

您的方法中的问题是,您误MatTableDataSource用了普通数组方法(简单表方法)。请查找此文档以实施该MatTableDataSource方法

于 2019-02-26T10:59:08.750 回答
2

你能试试这个方法吗:

  ngOnInit() {
    this.dashboardService.getFeedback.subscribe(
      res => {
        this.leadlist= res;
        this.dataSource = new MatTableDataSource(this.leadlist);
        this.dataSource.sort = this.sort;  //new line, also remove same from viewinit
      }
    );
  }
于 2019-02-26T10:59:09.590 回答