Angular MatTableDataSource filterPredicate не обновляет таблицу после обновления фильтра

import { Component, OnInit, AfterViewInit } from '@angular/core';
import { Coach } from "../../shared/models/User";
import { ManagementService } from "../../shared/services/management.service";
import { Router } from '@angular/router';
import { UtilsService } from 'src/app/shared/services/utils.service';
import * as moment from 'moment';
import swal from 'sweetalert2';
import { FormControl } from '@angular/forms';
import { MatTableDataSource } from '@angular/material/table';

@Component({
    selector: 'app-coaches',
    templateUrl: './coaches.component.html',
    styleUrls: ['./coaches.component.css']
})
export class CoachesComponent implements OnInit, AfterViewInit {
    dataSource;
    columnsToDisplay = ['username', 'email', 'actions'];
    coachList: Array<Coach> = [];
    username
    usernameFilter = new FormControl('');

    constructor(
        private managementService: ManagementService,
        private router: Router,
        private utils: UtilsService
    ) {
        this.dataSource = new MatTableDataSource();
        this.dataSource.filterPredicate = this.createFilter();
    }
    async ngAfterViewInit() {
        // await this.initializePage();
    }

    ngOnInit() {
        this.initializePage();

        this.usernameFilter.valueChanges
            .subscribe(
                username => {
                    this.username = username;
                    this.dataSource.filter = this.username;
                    console.info(this.dataSource.filter)
                }
            )
    }

    createFilter(): (data: Coach, filter: string) => boolean {
        let filterFunction = function (data, filter): boolean {
            return data.username.toLowerCase().indexOf(filter.toLowerCase()) !== -1
        }
        return filterFunction;
    }

    async initializePage() {
        let coaches: Array<Coach> = await this.managementService.getCoaches();
        this.coachList = coaches.sort(
            (prev, next) => {
                return moment(prev.createdAt).isBefore(moment(next.createdAt)) ? 1 : -1;
            }
        );
        this.dataSource = this.coachList
    }
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div class = "main-content zero_margin">
  <div class = "container-fluid">
    <div class = "row">
      <div class = "col-md-12">
        <div class = "card">
          <div class = "card-header card-header-primary card-header-icon">
            <div class = "card-icon">
              <i class = "material-icons">account_circle</i>
            </div>
            <h4 class = "card-title">Coaches</h4>
          </div>
          <div class = "card-body">
            <div class = "toolbar">
              <button mat-raised-button class = "btn btn-primary" (click) = "registerCoach()">Register</button>
              <div class = "col-lg-3 col-md-6 col-sm-4 add-select" style = "float: right;">
                <mat-form-field appearance = "standard">
                  <mat-label>Filter</mat-label>
                  <input matInput [formControl] = "usernameFilter" placeholder = "username" #input>
                </mat-form-field>
              </div>
            </div>
            <div style = "text-align: center" *ngIf = "coachList.length === 0">
              <br>
              <div style = "font-style: italic; color: gray">.:: No Registered Coaches ::.</div>
            </div>
            <table mat-table [dataSource] = "dataSource" class = "table table-striped table-no-bordered table-hover"
              cellspacing = "0" width = "100%" style = "width:100%">
              <ng-container matColumnDef = "username">
                <th mat-header-cell *matHeaderCellDef> Username </th>
                <td mat-cell *matCellDef = "let row"> {{row.username}} </td>
              </ng-container>
              <ng-container matColumnDef = "email">
                <th mat-header-cell *matHeaderCellDef> Email </th>
                <td mat-cell *matCellDef = "let row"> {{row.email}} </td>
              </ng-container>
              <ng-container matColumnDef = "actions">
                <th mat-header-cell *matHeaderCellDef> Actions </th>
                <td mat-cell *matCellDef = "let row">
                  <app-button-delete (onClick) = "deleteCoach(coach.id)"></app-button-delete>
                </td>
              </ng-container>
              <tr mat-header-row *matHeaderRowDef = "columnsToDisplay"></tr>
              <tr mat-row *matRowDef = "let row; columns: columnsToDisplay;"></tr>
            </table>
            <mat-paginator showFirstLastButtons [pageSizeOptions] = "[10, 25, 50, 100]"></mat-paginator>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Я очень новичок в Angular и работаю над проектом, ранее принадлежавшим другим людям.

Вопрос звучит как заголовок, я много искал, но пока ни один из ответов из stackoverflow не работает для меня.

Ниже приведен код, дайте мне знать, если вам нужна другая информация.

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

Это действительно смутило меня. Заранее спасибо за любую помощь и предложение!!!

Пожалуйста, разместите свой код в виде фрагментов вместо изображений.

Yong Shun 21.10.2022 05:43

@YongShun готово, но почему-то не компилируется

Anonymous 22.10.2022 04:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно назначить coachList как данные источника данных.

// replace this line
 this.dataSource = this.coachList

// with this
 this.dataSource.data = this.coachList

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

вау, это потрясающе, но не могли бы вы немного объяснить это или дать мне ссылку на какую-нибудь ссылку по этому поводу?

Anonymous 22.10.2022 06:52

Другие вопросы по теме