Не работает сортировка таблицы данных углового материала / стрелки не показаны - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь реализовать сортировку в моей таблице данных углового материала.

Она отображает данные правильно, но сортировка не работает, она даже не показывает маленькую стрелку рядом с заголовкомуказывает, что сортируется.

Вот мой компонент

import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ToastrService } from 'ngx-toastr';
import { Project, Activity, LearningObjective } from '../../models';
import { AuthService } from '../../services/auth.service';
import { MatSort, MatTableDataSource } from '@angular/material';
import { Router } from '@angular/router';

@Component({
  selector: 'app-activities',
  templateUrl: './activities.component.html',
  styleUrls: ['./activities.component.scss']
})
export class ActivitiesComponent implements OnInit, AfterViewInit {

  @ViewChild(MatSort) sort: MatSort;

  projects          : Array<Project>;
  loading           : boolean = false;
  displayedColumns  : string[] = ['name', 'goal', 'date', 'actions'];
  dataSource;

  constructor(
    private http          : HttpClient,
    private toastr        : ToastrService,
    public authService    : AuthService,
    private router        : Router
  ) {}

  ngOnInit() {
    this.getProjects();
  }

  getProjects() {
    this.loading = true;
    this.http.get<Project[]>('projects')
    .subscribe(
      response => {
        this.projects = response;
        this.dataSource = new MatTableDataSource(this.projects);
        this.loading = false;
      },
      err => {
        this.toastr.error(err.error.message, 'Error');
        this.loading = false;
      }
    )
  }

  ngAfterViewInit() {
    this.dataSource.sort = this.sort;
  }
}

И мой HTML

<div class="example-container mat-elevation-z8">
  <table mat-table [dataSource]="dataSource" matSort>

    <ng-container matColumnDef="name">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
      <td mat-cell *matCellDef="let element"> {{element.name}} </td>
    </ng-container>

    <ng-container matColumnDef="goal">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> Goal </th>
      <td mat-cell *matCellDef="let element"> {{element.goal}} </td>
    </ng-container>

    <ng-container matColumnDef="date">
      <th mat-header-cell *matHeaderCellDef mat-sort-header> Date </th>
      <td mat-cell *matCellDef="let element"> {{element.date}} </td>
    </ng-container>

    <ng-container matColumnDef="actions">
      <th mat-header-cell *matHeaderCellDef></th>
      <td mat-cell *matCellDef="let element">
        <div class="button-row">
          <button  mat-raised-button color="primary" [disabled]="loading ">
              <i class="fa fa-edit " *ngIf="!loading"></i>
              <i class="fa fa-spinner fa-spin " *ngIf="loading"></i>
            </button>
          <button mat-raised-button color="primary" (click)="deleteProject(element._id)" [disabled]="loading">
              <i class="fa fa-trash " *ngIf="!loading"></i>
              <i class="fa fa-spinner fa-spin " *ngIf="loading"></i>
            </button>
        </div>
        </td>
    </ng-container>

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

Как правильно реализовать сортировку в этом случае?Не могу щелкнуть заголовки таблицы, как в рабочем примере, поэтому мне интересно, чего здесь не хватает.

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Скорее всего, он не будет работать, потому что ваш асинхронный запрос на загрузку данных в ngOnInit занимает больше времени, чем для вызова ловушки жизненного цикла компонента ngAfterViewInit.Поэтому ваш dataSource по-прежнему не определен, и настройка сортировки не будет работать.

Вы могли бы изначально создать новый MatTableDataSource с пустым массивом, чтобы обойти эту проблему.Когда вы объявляете источник данных в своем компоненте:

dataSource = new MatTableDataSource([]);

А затем в вашем getProjects просто сделайте это:

this.dataSource.data = this.projects;
this.dataSource.sort = this.sort;

Проверьте stackblitz для решения.Я должен был смоделировать HTTP-запрос и использовать задержку для имитации запроса.

0 голосов
/ 02 мая 2019
    //try setTimeout instead of ngAfterViewInit


   setTimeout(
      () => {
        this.dataSource.sort = this.sort;
      }
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...