Угловой коврик-стол без фильтрации

#angular #typescript

Вопрос:

У меня есть коврик-стол для моего проекта. Я пытаюсь отфильтровать значение таблицы. Для этого я беру ввод от пользователя и применяю событие keyup.enter. Но это не фильтрует какое-либо значение. Я построил это отсюда. В этом примере значения фильтруются идеально, но не в моем случае. Даже в консоли нет ошибки. Здесь я добавляю свой код:

тс:

     dataSource: any[] = [];
    
    applyFilter(filterValue: any) {
        filterValue = filterValue.trim();
        filterValue = filterValue.toLowerCase();
        this.dataSource.filter = filterValue;
      }
 

HTML:

         <div class="example-header">
        <mat-form-field>
          <input
            matInput
            #inputBox
            (keyup)="applyFilter(inputBox.value)"
            placeholder="Search here"
          />
        </mat-form-field>
      </div>
      <mat-table #table [dataSource]="dataSource" matSort>
        <div>
          <ng-container matColumnDef="seriall no.">
            <mat-header-cell *matHeaderCellDef mat-sort-header
              >Serial</mat-header-cell
            >
            <mat-cell *matCellDef="let row; let i = index" data-label="seriall no.">
              {{ i   1 }}
            </mat-cell>
          </ng-container>
    
          <ng-container matColumnDef="name">
            <mat-header-cell *matHeaderCellDef mat-sort-header
              >Name</mat-header-cell
            >
            <mat-cell *matCellDef="let row" data-label="Name">
              <span fxFlex="50"
                >{{ row.user?.firstName }} {{ row.user?.lastName }}</span
              >
            </mat-cell>
          </ng-container>
    
          <ng-container matColumnDef="mail">
            <mat-header-cell *matHeaderCellDef mat-sort-header
              >E-Mail</mat-header-cell
            >
            <mat-cell *matCellDef="let row" data-label="E-Mail">
              <span fxFlex="50">{{ row.user?.email }}</span>
            </mat-cell>
          </ng-container>
    
          <ng-container matColumnDef="mobile">
            <mat-header-cell *matHeaderCellDef mat-sort-header
              >Mobile Number</mat-header-cell
            >
            <mat-cell *matCellDef="let row" data-label="Mobile Number">
              {{ row.user?.phone }}
            </mat-cell>
          </ng-container>
    
          <ng-container matColumnDef="date">
            <mat-header-cell *matHeaderCellDef mat-sort-header
              >Date</mat-header-cell
            >
            <mat-cell *matCellDef="let row" data-label="Date">
              <span fxFlex="50">{{ row.createAt }}</span>
            </mat-cell>
          </ng-container>
        </div>
    
        <ng-container matColumnDef="ticketDepartment">
          <mat-header-cell *matHeaderCellDef mat-sort-header
            >Department</mat-header-cell
          >
          <mat-cell *matCellDef="let row" data-label="Department">
            {{ row.ticketDepartment.name }}
          </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="subject">
          <mat-header-cell *matHeaderCellDef mat-sort-header
            >Subject</mat-header-cell
          >
          <mat-cell *matCellDef="let row" data-label="subject">
            {{ row.subject }}
          </mat-cell>
        </ng-container>
    
        <ng-container matColumnDef="issueDetails">
          <mat-header-cell *matHeaderCellDef mat-sort-header
            >Issue Details</mat-header-cell
          >
          <mat-cell *matCellDef="let row" data-label="issueDetails">
            <span fxFlex="80">{{ row.issueDetails }}</span>
          </mat-cell>
        </ng-container>
        <ng-container *ngIf="token.isAdmin()" matColumnDef="actions">
          <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>
          <mat-cell *matCellDef="let row">
            <button [matMenuTriggerFor]="menu" mat-button>
              <mat-icon>code</mat-icon>
            </button>
            <mat-menu #menu="matMenu">
              <button
                mat-raised-button
                class="Pending"
                (click)="changeStatus(row.id, TicketStatus.OnHold)"
              >
                <span class="btn-text"> On Hold </span>
              </button>
              <mat-divider></mat-divider
              ><button
                mat-raised-button
                class="Resolved"
                (click)="changeStatus(row.id, TicketStatus.Resolve)"
              >
                <span class="btn-text"> Resolve </span>
              </button>
              <mat-divider></mat-divider>
              <button
                mat-raised-button
                class="Rejected"
                (click)="changeStatus(row.id, TicketStatus.Reject)"
              >
                <span class="btn-text"> Reject </span>
              </button>
            </mat-menu>
          </mat-cell>
        </ng-container>
    
        <ng-container *ngIf="token.isOnlyCustomer()" matColumnDef="status">
          <mat-header-cell *matHeaderCellDef mat-sort-header
            >Status</mat-header-cell
          >
          <mat-cell *matCellDef="let row" data-label="issueDetails">
            {{ TicketStatus[row.status] }}
          </mat-cell>
        </ng-container>
    
        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
      </mat-table>
 

Комментарии:

1. Можете ли вы создать минимальный, воспроизводимый пример на StackBlitz с предоставленными образцами данных? Спасибо.

2. @YongShun Вот оно stackblitz.com/edit/angular-ryjgre?file=src/app/…

3. Привет, исходный код вашей ссылки на StackBlitz не был тем же кодом, который вы опубликовали в вопросе для HTML-части .

4. @YongShun да. На самом деле изменения касаются только содержимого таблицы. на самом деле то, что я там разместил, — это мой проект в реальном времени, в котором я получаю данные из базы данных. Так что это не подлежит обмену. Вот почему я создал это.

Ответ №1:

Вам необходимо инициализировать источник MatTableDataSource данных следующим образом: dataSource = new MatTableDataSource(ELEMENT_DATA); если вы хотите использовать функциональность фильтра mat-table компонента, как указано в документации

Источник данных, который принимает массив данных на стороне клиента и включает встроенную поддержку фильтрации, сортировки (с использованием MatSort) и разбиения на страницы (с использованием MatPaginator).

Вы можете найти документацию MatTableDataSource здесь MatTableDataSource, а также рабочий пример