【问题标题】:Mat Paginator not working with FormArray on Material TableMat Paginator 不适用于材料表上的 FormArray
【发布时间】:2020-05-27 06:16:09
【问题描述】:

我正在使用带有 formArray 的 mat-table,我还需要 Mat-paginator。

但不幸的是,分页不起作用。

Stackbltiz Demo

示例来源,

.html

<form [formGroup]="form">
  <table mat-table [dataSource]="dataSource" formArrayName="dates">
    <!-- Row definitions -->
    <tr mat-header-row *matHeaderRowDef="displayColumns"></tr>
    <tr mat-row *matRowDef="let row; let i = index; columns: displayColumns;"></tr>

    <!-- Column definitions -->
    <ng-container matColumnDef="from">
      <th mat-header-cell *matHeaderCellDef> From </th>
      <td mat-cell *matCellDef="let row; let index = index"  [formGroupName]="index"> 
        <input type="date" formControlName="from" placeholder="From date">
      </td>
    </ng-container>

    <ng-container matColumnDef="to">
      <th mat-header-cell *matHeaderCellDef> To </th>
      <td mat-cell *matCellDef="let row; let index = index"  [formGroupName]="index">
        <input type="date" formControlName="to" placeholder="To date">
      </td>
    </ng-container>
  </table>
  <mat-paginator [pageSizeOptions]="[5, 10, 25, 100]"></mat-paginator>
  <button type="button" (click)="addRow()">Add row</button>
</form>

<pre>{{ form.value | json }}</pre>

.Ts

@ViewChild(MatPaginator) paginator: MatPaginator;
      dataSource = new MatTableDataSource<any>();
      displayColumns = ['from', 'to'];
      form: FormGroup = this.fb.group({ 'dates': this.fb.array([]) });

      constructor(private fb: FormBuilder) { }

      ngOnInit() {
        this.dataSource.paginator = this.paginator;
      }

      get dateFormArray():FormArray {
        return this.form.get('dates') as FormArray;
      }

      addRow() {
        const row = this.fb.group({
          'from'   : null,
          'to'     : null
        });
        this.dateFormArray.push(row);
        this.dataSource.data =  this.dateFormArray.controls;
      }

【问题讨论】:

    标签: angular-material angular7 mat-table mat-pagination


    【解决方案1】:

    其实有两个问题:

    1. mat-paginator@ViewChild 中的元素引用问题
    2. 获取MatDataSource 的实际索引(因为您有两个数据结构来列出数据dataSourceFormArray

    第一个问题的解决方案是像这样导入分页器和mat-datasource

    import { MatPaginator } from "@angular/material/paginator";
    import {MatTableDataSource} from '@angular/material/table';
    

    对于第二个问题,您必须获得像这样的实际索引:

    getActualIndex(index : number)    {
        return index + this.paginator.pageSize * this.paginator.pageIndex;
    }
    

    并使用[formGroupName]="getActualIndex(index)"

    WORKING EXAMPLE

    您还可以根据在 formArray 中添加元素,在下拉菜单中增加页面大小。

    【讨论】:

    • 这不是对数据的控制,它只是添加页码
    • 第二部分救了我的命
    猜你喜欢
    • 2021-04-21
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多