Това е късен отговор, но със сигурност ще помогне на тези, които се интересуват.
Можете да използвате mat-table-filter за филтриране. Поддържа и филтриране на масиви. Това ви спестява от внедряване на шаблон за филтриране, включително отблъскване и т.н.
Единственото нещо, което трябва да направите, е да добавите директива matTableFilter
към вашата таблица с материали и да обвържете exampleEntity
с представяне на това, което имате като елемент във вашия източник на данни.
<table mat-table matTableFilter [dataSource]="dataSource"
[exampleEntity]="exampleObject"...>
Това е всичко. Когато попълните свойствата на exampleObject, филтърът автоматично ще работи добре с поддръжката за премахване на удари по подразбиране. Можете също да промените времето за премахване на отскок.
Можете да разгледате примерите тук: https://halittalha.github.io/ng-material-extensions/
Споделям пълния изходен код за филтриране на масиви по-долу. Примерът по-долу използва компонент чипове за събиране на съдържанието на масива за филтриране.
.html
<mat-table matTableFilter [exampleEntity]="filterEntity" [filterType]="filterType" [dataSource]="dataSource"
class="mat-elevation-z8">
<ng-container matColumnDef="category">
<mat-header-cell *matHeaderCellDef>
<mat-form-field appearance="outline">
<input matInput placeholder="Category" [(ngModel)]="filterEntity.category">
</mat-form-field>
</mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.category}} </mat-cell>
</ng-container>
<ng-container matColumnDef="brand">
<mat-header-cell *matHeaderCellDef>
<mat-form-field appearance="outline">
<input matInput placeholder="Product Brand" [(ngModel)]="filterEntity.brand">
</mat-form-field>
</mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.brand}} </mat-cell>
</ng-container>
<ng-container matColumnDef="availableSizes">
<mat-header-cell *matHeaderCellDef>
<mat-form-field class="example-chip-list">
<mat-chip-list #chipList aria-label="Fruit selection">
<mat-chip *ngFor="let size of filterEntity.availableSizes" [selectable]="true" [removable]="true"
(removed)="remove(size)">
{{size}}
<mat-icon matChipRemove>cancel</mat-icon>
</mat-chip>
<input placeholder="Add Size" [matChipInputFor]="chipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes" [matChipInputAddOnBlur]="true"
(matChipInputTokenEnd)="add($event)">
</mat-chip-list>
</mat-form-field>
</mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.availableSizes}} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>
.ts
import { MatTableFilter } from 'mat-table-filter';
import { Component, OnInit } from '@angular/core';
import { MatTableDataSource, MatChipInputEvent } from '@angular/material';
import { COMMA, ENTER } from '@angular/cdk/keycodes';
export class Product {
category: string;
brand: string;
availableSizes: Array<string>;
}
const PRODUCTS: Product[] = [
{category: 'T-Shirt', brand: 'X', availableSizes: ['S', 'M', 'L', 'XL']},
{category: 'T-Shirt', brand: 'Y', availableSizes: ['S', 'L', 'XL']},
{category: 'T-Shirt', brand: 'Z', availableSizes: ['XL']},
{category: 'Jean', brand: 'X', availableSizes: ['S', 'M', 'L', 'XL']},
{category: 'Jean', brand: 'Y', availableSizes: ['S', 'M']},
{category: 'Jean', brand: 'Z', availableSizes: ['S', 'M', 'L']},
{category: 'Jean', brand: 'B', availableSizes: ['S', 'M', 'L']},
{category: 'Jacket', brand: 'X', availableSizes: ['S', 'L', 'XL']},
{category: 'Jacket', brand: 'Z', availableSizes: ['S']},
{category: 'Pants', brand: 'X', availableSizes: ['S', 'M', 'L', 'XL']},
{category: 'Pants', brand: 'Y', availableSizes: ['L', 'XL']},
{category: 'Pants', brand: 'Z', availableSizes: ['S']},
{category: 'Hat', brand: 'X', availableSizes: ['S', 'M', 'L']},
{category: 'Skirt', brand: 'X', availableSizes: ['S', 'M', 'L', 'XL']},
{category: 'Skirt', brand: 'Y', availableSizes: ['S', 'M', 'L']}
];
@Component({
selector: 'app-array-filter',
templateUrl: './array-filter.component.html',
styleUrls: ['./array-filter.component.css']
})
export class ArrayFilterComponent implements OnInit {
filterEntity: Product;
filterType: MatTableFilter;
displayedColumns: string[] = ['category', 'brand', 'availableSizes'];
dataSource;
readonly separatorKeysCodes: number[] = [ENTER, COMMA];
add(event: MatChipInputEvent): void {
const input = event.input;
const value = event.value;
if ((value || '').trim()) {
this.filterEntity.availableSizes.push(value.trim());
}
// Reset the input value
if (input) {
input.value = '';
}
}
remove(size: string): void {
const index = this.filterEntity.availableSizes.indexOf(size);
if (index >= 0) {
this.filterEntity.availableSizes.splice(index, 1);
}
}
ngOnInit() {
this.filterEntity = new Product();
this.filterEntity.availableSizes = new Array<string>(); // DO NOT FORGET TO INIT THE ARRAY
this.filterType = MatTableFilter.ANYWHERE;
this.dataSource = new MatTableDataSource(PRODUCTS);
}
}
person
talhature
schedule
04.06.2020
let filteredData = this.users.filter(user => !(addedUserEmails.indexOf(user.email) > -1));
След това можете да го добавите така --›this.dataSource.data = filteredData;
- person sagat   schedule 06.08.2019this.users.filter(user => !(addedUserEmails.indexOf(user.email) > -1));
, получавам грешка на компилатора. - person Jake12342134   schedule 06.08.2019this.users
еusers: MatTableDataSource<GoogleUser> = new MatTableDataSource([]);
, всичко, което искам да направя, е да филтрирам данните, така че ако има имейли в източника на данни вaddedUserEmails
, те да не се показват в таблицата - person Jake12342134   schedule 06.08.2019