Angular Material mat-table定义组件中的可重用列

Nei*_*ens 5 angular-material2 angular 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() {
  }

}
Run Code Online (Sandbox Code Playgroud)

并在表中使用它

<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>
Run Code Online (Sandbox Code Playgroud)

和displayedColumns是:

  displayedColumns = [
    'select'
  ];
Run Code Online (Sandbox Code Playgroud)

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

yur*_*zui 10

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

@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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Ng-run示例

另一种方法是在父组件中提供该名称,如角度材料问题 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>
Run Code Online (Sandbox Code Playgroud)

SelectColumnComponent

@Input()
get name(): string { return this._name; }
set name(name: string) {
    this._name = name;
    this.columnDef.name = name;
}
Run Code Online (Sandbox Code Playgroud)