Проблема сортировки с помощью matSort с данными API

Моя таблица mat работает нормально, но при добавлении mat-sort в соответствии с официальной документацией api она не работает в ngAfterViewInit со следующим сообщением

ERROR TypeError: невозможно установить для свойства sort значение undefined

Первый снимок экрана с ошибкой .. Без сортировки

Данные отображаются правильно из api, я переместил код в конструктор компонента, чтобы установить это только в onInit: this.listData.sort = this.sort;

Я импортировал модуль в app.module.

Итак, вот мои 3 файла:

Componenet.html

  <mat-table [dataSource]="listData" matSort>
    <ng-container matColumnDef="gender">
      <mat-header-cell *matHeaderCellDef mat-sort-header>Gender</mat-header-cell>
      <mat-cell *matCellDef="let element">{{element.gender}}</mat-cell>
    </ng-container>
    <ng-container matColumnDef="firstname">
      <mat-header-cell *matHeaderCellDef mat-sort-header>First Name</mat-header-cell>
      <mat-cell *matCellDef="let element">{{element.firstname}}</mat-cell>
    </ng-container>

component.ts

import {AfterViewInit, Component, OnInit, ViewChild} from '@angular/core';
import {PersonneService} from '../../shared/personne.service';
import { MatTableDataSource, MatSort} from '@angular/material';
import {Personne} from '../../personne';

@Component({
  selector: 'app-personne-list',
  templateUrl: './personne-list.component.html',
  styleUrls: ['./personne-list.component.css']
})
export class PersonneListComponent implements AfterViewInit {

  personne: any = [];
  constructor(private service: PersonneService) {
    this.service.getPersonnes().subscribe((data: {}) => {
      this.personne = data;
      this.listData = new MatTableDataSource(this.personne);
    });
  }

  listData: MatTableDataSource<Personne>;
  displayedColumns: string[] = ['gender', 'firstname', 'lastname', 'address', 'city', 'state', 'ordertotal', 'actions'];

  @ViewChild(MatSort) sort: MatSort;
  ngAfterViewInit() {
    console.log({SORT: this.sort});
    this.listData.sort = this.sort;
  }

}

Service.ts:

import { Injectable } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
import {Personne} from '../personne';
import {Observable} from 'rxjs';
import {map} from 'rxjs/operators';


@Injectable({
  providedIn: 'root'
})
export class PersonneService {

  constructor(private http: HttpClient) { }
  form: FormGroup = new FormGroup({
    firstname: new FormControl('', Validators.required),
    lastname: new FormControl('', Validators.required),
    address: new FormControl('', [Validators.minLength(8), Validators.required]),
    city: new FormControl(''),
    state: new FormControl(''),
    gender: new FormControl('1'),
    ordertotal: new FormControl('')
  });

  endpointGet = 'http://localhost:3000/api/personnes';
  endpointPost = 'http://localhost:3000/api/personne/';

  getPersonnes() {
    return this.http.get(this.endpointGet);
  }

Пока я писал этот вопрос, я нашел ответ: https://stackoverflow.com/a/53112864/11295075

И я добавил это в html: [hidden] = "! ListData.data" matSort

Стало: <mat-table [dataSource]="listData" [hidden]="!listData.data" matSort>

Теперь, когда я нажимаю кнопку сортировки, но не правильно, в консоли появляется ошибка: ERROR TypeError: не удается прочитать данные свойства undefined

Вторая ошибка

Спасибо за помощь.


person Community    schedule 06.04.2019    source источник


Ответы (1)


Переместите эту линию

    this.listData.sort = this.sort;

от ngAfterViewInit до того момента, когда у вас действительно будет listData. То есть после возврата и обработки getPersonnes(). То есть здесь:

    this.service.getPersonnes().subscribe((data: {}) => {
      this.personne = data;
      this.listData = new MatTableDataSource(this.personne);
      this.listData.sort = this.sort;
    });

Что касается ERROR TypeError: Cannot read property 'data' of undefined, его легко исправить с помощью оператора безопасной навигации.

В <mat-table [dataSource]="listData" [hidden]="!listData.data" matSort> измените его на [hidden]="!listData?.data". Таким образом, он будет пытаться получить доступ только к listData.data, когда listData определен.

person mbojko    schedule 06.04.2019
comment
Спасибо, ошибка не отображается. Но когда сортировка не организована, она перемешивается случайным образом. у тебя есть идеи ? - person ; 06.04.2019