angular - 使用 Angular Material 按列过滤谓词表

标签 angular angular-material

我想使用谓词过滤器按列过滤我的 mat-table 结果。我已经使用了一个简单的过滤器,但它过滤了所有列中的所有数据。我搜索类似的主题,但我不知道如何使用它。 我尝试对所有列重复我的代码,但不起作用..

请参阅下面的代码:

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
</mat-form-field>
<div class="example-container mat-elevation-z8">
    <div class="example-header">
        <div>
            <mat-table [dataSource]="dataSource" matSort>
                <ng-container matColumnDef="aa">
                    <mat-header-cell *matHeaderCellDef mat-sort-header>aa title</mat-header-cell>
                    <mat-cell *matCellDef="let user"> {{user.aa}} </mat-cell>
                </ng-container>
                <ng-container matColumnDef="bb">
                    <mat-header-cell *matHeaderCellDef mat-sort-header> bb tilte </mat-header-cell>
                    <mat-cell *matCellDef="let user"> {{user.bb}} </mat-cell>
                </ng-container>
                <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
                <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
            </mat-table>
            <mat-paginator [pageSizeOptions]="[5, 10, 25, 100]"></mat-paginator>
        </div>
    </div>
</div>

和我的.ts:

export class MynewComponent implements OnInit {
    dataSource = new MatTableDataSource();
    displayedColumns = ['aa', 'bb'];
    @ViewChild(MatPaginator) paginator: MatPaginator;
    @ViewChild(MatSort) sort: MatSort;

    constructor(private materialService: MaterialService) {}

    ngOnInit() {
        this.materialService.getUser().subscribe(value =>{this.dataSource.data = value;});
        this.dataSource.paginator = this.paginator;
        this.dataSource.sort = this.sort;
    }

    applyFilter(filterValue: string) {
        filterValue = filterValue.trim(); // Remove whitespace
        filterValue = filterValue.toLowerCase(); // Datasource defaults to lowercase matches
        this.dataSource.filter = filterValue;
        if (this.dataSource.paginator) {
            this.dataSource.paginator.firstPage();
        }
    }
}

export class UserDataSource extends DataSource<any> {
    constructor(private materialService: MaterialService) {
        super();
    }

    connect(): Observable<MaterialModel[]> {
        return this.materialService.getUser();
    }

    disconnect() {}
}

最佳答案

HTML applyFilter 中添加 7 个差异输入字段,将输入值和该列的键作为字符串传递

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value, 'aa')" placeholder="Filter">
</mat-form-field>

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value, 'bb')" placeholder="Filter">
</mat-form-field>

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value, 'col3')" placeholder="Filter">
</mat-form-field>

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value, 'col4')" placeholder="Filter">
</mat-form-field>

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value, 'col5')" placeholder="Filter">
</mat-form-field>

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value, 'col6')" placeholder="Filter">
</mat-form-field>

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value, 'col7')" placeholder="Filter">
</mat-form-field>

You can find other ways of writing HTML according to your requirement of design.

组件

创建具有的过滤器对象:列键和:过滤器值

filterObj = {};
applyFilter(filterValue: string, key: string) {
    this.filterObj = {
        value: filterValue.trim().toLowerCase(),
        key: key
    }
    this.dataSource.filter = filterValue;
    if (this.dataSource.paginator) {
        this.dataSource.paginator.firstPage();
    }
}

filterPredicate 更新为:

this.dataSource.filterPredicate = (data, filter) => {
    if(data[this.filterObj['key']] && this.filterObj['key']) {
        return data[this.filterObj['key']].toLowerCase().includes(this.filterObj['value']);
    }
    return false;
}

关于angular - 使用 Angular Material 按列过滤谓词表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50639743/

相关文章:

angular - Angular4 项目中未加载字体超棒的图标

javascript - 在 Angular 应用程序中全局使用 ngx-toastr

Angular 2 : Load Component Based on service response

css - 如何使 td 行的全高?棱 Angular Material

angular - 如何将动态值传递给 matIcon?

Angular 4选择整个对象

javascript - 获取输入元素的显示文本

angular - 更新 Angular 7 时出错 -> Angular 8

angular - 为什么在此 FormArray 中无法编辑 mat-form-field?

angular - 如何在另一个 ng 模块上导入/使用延迟加载模块