Как использовать matSort для сортировки столбцов в таблице mat?

Я пытаюсь реализовать сортировку в мат-таблице, но она вообще не работает. Я не получаю ошибок.

Вот мой код.

Это мой файл component.ts

export class TerminalsComponent implements OnInit {

      cols: string[] = ['select', 'serialKey', 'cameras', 'status', 'activeSince', 'created', 'updated', 'addCamera', 'more'];

      success: boolean;
      message: string;

      dataSource;

      expandedElement: any;

      initialSelection = [];
      allowMultiSelect = true;
      selection = new SelectionModel<any>(this.allowMultiSelect, this.initialSelection);

      @ViewChild(MatSort) sort: MatSort;
      constructor(public cs: Service) {

        this.getTerminals();
      }

      masterToggle() {
        this.isAllSelected() ?
          this.selection.clear()
          : this.dataSource.data.forEach(row => this.selection.select(row));
      }

      isAllSelected() {
        const numSelected = this.selection.selected.length;
        const numRows = this.dataSource.data.length;
        return numSelected === numRows;
      }

      // Expandable Row
      isExpansionDetailRow(i: number, row: Object) {
        return row.hasOwnProperty('detailRow');
      }

      getTerminals() {
        this.cs.getTerminals().subscribe(
          (response) => {
            this.success = response.success;
            this.message = response.msg;
            if (response.success) {
              this.dataSource = new MatTableDataSource(response.data);

              this.dataSource.sort  = this.sort;
              console.log(this.dataSource);

            }

            setTimeout(function () {
              this.message = "";
            }.bind(this), 2000);
          },
          (error) => {
            this.success = error.success;
            this.message = "Cannot get terminals" + error.message;
          }
        );
      }

      ngOnInit() { }

}

Терминалы, источник данных для таблицы mat, представляют собой массив вложенных объектов. serialKey - это строка.

Вот фрагмент кода моего файла component.html. Я добавил mat-sort-header в столбец serialKey.

  <mat-table class="list-table" [dataSource]="dataSource" matSort matSortActive="serialKey" matSortDirection="asc">

    <ng-container matColumnDef="serialKey">
      <mat-header-cell mat-sort-header class="align-center" *matHeaderCellDef>Serial Key</mat-header-cell>
      <mat-cell class="align-center" *matCellDef="let element">{{element.serial_num}}
      </mat-cell>
    </ng-container>

    </mat-row>

  </mat-table>

Было бы здорово, если бы кто-нибудь мог сказать мне, чего мне здесь не хватает, чтобы отсортировать таблицу.


person Rashmi Rai    schedule 26.09.2018    source источник


Ответы (1)


Мне пришлось обернуть свой в setTimeout, если это не сработает в вашем случае, сообщите мне, и я удалю этот ответ.

setTimeout(() = > this.dataSource.sort  = this.sort);
person Marshal    schedule 15.10.2018
comment
Спасибо, Маршал. Мне пришлось определить sortingDataAccessor, чтобы он работал. - person Rashmi Rai; 14.11.2018