Angular Material 垫表定义组件中的可重用列

标签 angular angular-material2 mat-table

有人知道是否可以创建一个用于 mat-table 的“列”组件,我已经尝试为常用的列定义创建一个组件但是当添加到表中时我得到一个无法找到的错误列选择器,我的列定义如下:

@Component({
  selector: 'iam-select-column',
  template: `
  <ng-container matColumnDef="select">
    <mat-header-cell *matHeaderCellDef>
      <mat-checkbox></mat-checkbox>
    </mat-header-cell>
    <mat-cell *matCellDef="let row">
      <mat-checkbox></mat-checkbox>
    </mat-cell>
  </ng-container>
  `,
  styles: [`
  `]
})
export class SelectColumnComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

}

并在表格中使用它

<mat-table class="mat-elevation-z8">

  <iam-select-column></iam-select-column>

  <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
  <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>

</mat-table>

显示的列是:

  displayedColumns = [
    'select'
  ];

是否可以这样做,因为我想避免在有选择列的表中出现重复?

最佳答案

为了使其正常工作,您必须使用 table.addColumnDef 方法将 columnDef 手动添加到表中。

@Component({
  selector: 'iam-select-column',
  template: `
    <ng-container matColumnDef="select">
        ...
    </ng-container>
  `
})
export class SelectColumnComponent implements OnInit {
  @ViewChild(MatColumnDef) columnDef: MatColumnDef;

  constructor(@Optional() public table: MatTable<any>, private cdRef: ChangeDetectorRef) { }

  ngOnInit() {
    if (this.table) {
      this.cdRef.detectChanges();
      this.table.addColumnDef(this.columnDef);
    }
  }
}

但在执行此操作之前,我们必须确保 matColumnDef 指令已经完成绑定(bind)初始化,以便它具有 name。为此,我们必须在该组件上运行 detectChanges。

Ng-run Example

另一种方法是在父组件中提供该名称,如 Angular Material 问题中所述 https://github.com/angular/material2/issues/13808#issuecomment-434417804 :

parent.html

<mat-table class="mat-elevation-z8">

  <iam-select-column name="select"></iam-select-column>

选择列组件

@Input()
get name(): string { return this._name; }
set name(name: string) {
    this._name = name;
    this.columnDef.name = name;
}

关于Angular Material 垫表定义组件中的可重用列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53100204/

相关文章:

css - 在 mat-table 中只选择一行,如果选择其他行,则取消选择第一行

javascript - 如何使用 moment 将时间转换为百分比

angular - NGX 数据表 - 使用函数重置偏移量

angular - Angular Material 日期选择器中的日期不正确

angular - 为什么 mat-tables matRowDef 包含 2 个变量?

css - 如何让 mat-table 自动调整大小以适合标题

javascript - 导入 ngrx 开发工具时无法读取未定义的属性 'whitelist'

visual-studio - 在 Chrome 中运行的 Angular 4 应用程序的 Visual Studio 2017 中的选择控件上不会触发更改和 ngModelChange

Angular Material 2 : use a different font config for headers?

angular - 在 ngFor 中有一个 mat-radio-button 与 Reactive Forms 一起使用