代码之家  ›  专栏  ›  技术社区  ›  bereket gebredingle

具有列值的物料表数据源筛选器

  •  29
  • bereket gebredingle  · 技术社区  · 6 年前

    如何过滤具有特定列的物料数据表?

    public dataSource;
    
    
    this.dataSource = new MatTableDataSource(this.items);
            this.dataSource.filterPredicate = function customFilter(data , filter:string ): boolean {
                return (data.name.startsWith(filter));
            }
    
    applyFilter(filterValue: string) {
        filterValue = filterValue.trim(); // Remove whitespace
        filterValue = filterValue.toLowerCase(); // MatTableDataSource defaults to lowercase matches
        this.dataSource.filter = filterValue;
    }
    

    当我键入返回的数据不匹配时,上述代码不起作用。

    7 回复  |  直到 6 年前
        1
  •  37
  •   Myk Willis    2 年前

    从…起 the docs

    例如,数据对象{id:123,名称:“Mr.Smith”,favoriteColor:“blue”}将减少为123mr。史密斯蓝。如果筛选字符串为蓝色,则会将其视为匹配,因为它包含在简化字符串中,并且该行将显示在表中。

    要覆盖默认过滤行为,请使用自定义过滤器预测 可以设置函数,该函数接受数据对象和筛选器字符串,并且 如果数据对象被视为匹配,则返回true。

    如果要仅使用筛选器特定列,则需要重写 filterPredicate 答案已经是 here

    这是过滤的工作示例。

    表筛选示例。html

    <div class="example-container mat-elevation-z8">
      <div class="example-header">
        <mat-form-field>
          <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
        </mat-form-field>
      </div>
    
      <mat-table #table [dataSource]="dataSource">
    
        <!-- Position Column -->
        <ng-container matColumnDef="position">
          <mat-header-cell *matHeaderCellDef> No. </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.position}} </mat-cell>
        </ng-container>
    
        <!-- Name Column -->
        <ng-container matColumnDef="name">
          <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
        </ng-container>
    
        <!-- Weight Column -->
        <ng-container matColumnDef="weight">
          <mat-header-cell *matHeaderCellDef> Weight </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.weight}} </mat-cell>
        </ng-container>
    
        <!-- Symbol Column -->
        <ng-container matColumnDef="symbol">
          <mat-header-cell *matHeaderCellDef> Symbol </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.symbol}} </mat-cell>
        </ng-container>
    
        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
      </mat-table>
    </div>
    

    表筛选示例。ts

      import {Component} from '@angular/core';
        import {MatTableDataSource} from '@angular/material';
        
        /**
         * @title Table with filtering
         */
        @Component({
          selector: 'table-filtering-example',
          styleUrls: ['table-filtering-example.css'],
          templateUrl: 'table-filtering-example.html',
        })
        export class TableFilteringExample {
          displayedColumns = ['position', 'name', 'weight', 'symbol'];
          dataSource = new MatTableDataSource(ELEMENT_DATA);
        
          applyFilter(filterValue: string) {
            filterValue = filterValue.trim(); // Remove whitespace
            filterValue = filterValue.toLowerCase(); // MatTableDataSource defaults to lowercase matches
            this.dataSource.filter = filterValue;
          }
        }
        
        export interface Element {
          name: string;
          position: number;
          weight: number;
          symbol: string;
        }
        
        const ELEMENT_DATA: Element[] = [
          {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'},
          {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'},
          {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'},
          {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'},
          {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'},
          {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'},
          {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'},
          {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'},
          {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'},
          {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'},
          {position: 11, name: 'Sodium', weight: 22.9897, symbol: 'Na'},
          {position: 12, name: 'Magnesium', weight: 24.305, symbol: 'Mg'},
          {position: 13, name: 'Aluminum', weight: 26.9815, symbol: 'Al'},
          {position: 14, name: 'Silicon', weight: 28.0855, symbol: 'Si'},
          {position: 15, name: 'Phosphorus', weight: 30.9738, symbol: 'P'},
          {position: 16, name: 'Sulfur', weight: 32.065, symbol: 'S'},
          {position: 17, name: 'Chlorine', weight: 35.453, symbol: 'Cl'},
          {position: 18, name: 'Argon', weight: 39.948, symbol: 'Ar'},
          {position: 19, name: 'Potassium', weight: 39.0983, symbol: 'K'},
          {position: 20, name: 'Calcium', weight: 40.078, symbol: 'Ca'}, ];
    

    可以使用filterPredicate筛选特定列,如下所示:

      ngOnInit() {
        this.dataSource.filterPredicate = (data: Element, filter: string) => {
          return data.name == filter;
         };
       }
     applyFilter(filterValue: string) {
        // filterValue = filterValue.trim(); // Remove whitespace
        // filterValue = filterValue.toLowerCase(); // MatTableDataSource defaults to lowercase matches
        this.dataSource.filter = filterValue;
      }
    

    我已经更改了 applyFilter() 并补充道 ngOnInit() .现在只起作用 列和完全相同的值 (==)

        2
  •  9
  •   talhature    5 年前

    您可以利用 mat-table-filter 用于复杂的过滤目的。

    为了筛选列,需要定义一个示例实体,并仅填充属于相应列的特性。

    以下是一个示例: https://stackblitz.com/github/HalitTalha/mat-table-filter-example

        3
  •  8
  •   Rui Marques    6 年前

    您可以通过动态列进行筛选,如 无硬编码列名 ,执行以下操作:

    // On input focus: setup filterPredicate to only filter by input column
    setupFilter(column: string) {
      this.dataSource.filterPredicate = (d: TableDataSourceType, filter: string) => {
        const textToSearch = d[column] && d[column].toLowerCase() || '';
        return textToSearch.indexOf(filter) !== -1;
      };
    }
    
    applyFilter(filterValue: string) {
      this.dataSource.filter = filterValue.trim().toLowerCase();
    }
    

    在模板中,可以有如下内容:

    <ng-container matColumnDef="item-filter">
      <th mat-header-cell *matHeaderCellDef>
        <input (keyup)="applyFilter($event.target.value)" (focus)="setupFilter('name')" />
      </th>
    </ng-container>
    

    或者更复杂的示例,使用逐列筛选动态创建标题行:

    <table mat-table [dataSource]="dataSource">
       <ng-container *ngFor="let filterCol of ['names', 'age', 'address']">
         <ng-container matColumnDef="filterCol">
           <th mat-header-cell *matHeaderCellDef>
             <input (keyup)="applyFilter($event.target.value)" (focus)="setupFilter(filterCol)"/>
           </th>
         </ng-container>
       </ng-container>
    
       <tr mat-header-row *matHeaderRowDef="['names', 'age', 'address']"></tr>
    </table>
    

    请注意 不能 具有多个具有相同键的标题行,因此这将不起作用:

    <tr mat-header-row *matHeaderRowDef="['names', 'age', 'address']"></tr>
    <tr mat-header-row *matHeaderRowDef="['names', 'age', 'address']"></tr>
    
        4
  •  6
  •   Code Spy    5 年前

    使用创建材质表的自定义过滤器选择框 过滤器预测 使用替代 customFilter() 方法

    演示 Link

    来源 Link enter image description here

            ...
            ngOnInit() {
                this.getRemoteData();
    
                // Overrride default filter behaviour of Material Datatable
                this.dataSource.filterPredicate = this.createFilter();
            }
            ...
    
            // Custom filter method fot Angular Material Datatable
            createFilter() {
                let filterFunction = function (data: any, filter: string): boolean {
                let searchTerms = JSON.parse(filter);
                let isFilterSet = false;
                for (const col in searchTerms) {
                    if (searchTerms[col].toString() !== '') {
                    isFilterSet = true;
                    } else {
                    delete searchTerms[col];
                    }
                }
    
                let nameSearch = () => {
                    let found = false;
                    if (isFilterSet) {
                    for (const col in searchTerms) {
                        searchTerms[col].trim().toLowerCase().split(' ').forEach(word => {
                        if (data[col].toString().toLowerCase().indexOf(word) != -1 && isFilterSet) {
                            found = true
                        }
                        });
                    }
                    return found
                    } else {
                    return true;
                    }
                }
                return nameSearch()
                }
                return filterFunction
            }
    
        5
  •  2
  •   Sushil    4 年前

    应用程序。组件。html

     <mat-form-field floatPlaceholder="never">
                <input matInput placeholder="Filter name" (keyup)="applyFilter($event.target.value)">
              </mat-form-field>
            <mat-table matSort  [dataSource]="dataSource" class="mat-elevation-z8">
               
                <!-- Position Column -->
                <ng-container matColumnDef="position">
                  <mat-header-cell *matHeaderCellDef mat-sort-header> No. </mat-header-cell>
                  <mat-cell *matCellDef="let element"> {{element.position}} </mat-cell>
                </ng-container>
              
                <!-- Name Column -->
                <ng-container matColumnDef="name">
                  <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>
                  <mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
                </ng-container>
              
                <!-- Weight Column -->
                <ng-container matColumnDef="weight">
                  <mat-header-cell *matHeaderCellDef mat-sort-header> Weight </mat-header-cell>
                  <mat-cell *matCellDef="let element"> {{element.weight}} </mat-cell>
                </ng-container>
              
                <!-- Symbol Column -->
                <ng-container matColumnDef="symbol">
                  <mat-header-cell *matHeaderCellDef mat-sort-header> Symbol </mat-header-cell>
                  <mat-cell *matCellDef="let element"> {{element.symbol}} </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 [pageSize]="5" [pageSizeOptions]="[5, 10, 15]" showFirstLastButtons></mat-paginator>
    

    应用程序。组成部分ts

    import { Component, OnInit, ViewChild } from '@angular/core';
    import { MatPaginator } from '@angular/material/paginator';
    import { MatTableDataSource } from '@angular/material/table';
    import { MatSort } from '@angular/material/sort';
    export interface PeriodicElement {
      name: string;
      position: number;
      weight: number;
      symbol: string;
    }
    
    const ELEMENT_DATA: PeriodicElement[] = [
      { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },
      { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },
      { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },
      { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },
      { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },
      { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },
      { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },
      { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },
      { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },
      { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },
    ];
    
    @Component({
      selector: 'app-mat-table',
      templateUrl: './mat-table.component.html',
      styleUrls: ['./mat-table.component.css'],
    })
    export class MatTableComponent {
      displayedColumns: string[] = ['position', 'name', 'weight', 'symbol'];
      dataSource = new MatTableDataSource<PeriodicElement>(ELEMENT_DATA);
    
      @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
      @ViewChild(MatSort, { static: true }) sort: MatSort;
    
      ngOnInit() {
        this.dataSource.paginator = this.paginator;
        this.dataSource.sort = this.sort;
      }
      applyFilter(filterValue: string) {
        this.dataSource.filter = filterValue.trim().toLowerCase();
      }
    }
    
        6
  •  1
  •   Joe Mayo    5 年前
    applyFilter(event: Event) {
        const filterValue = (event.target as HTMLInputElement).value;
        if (filterValue == '') {
            this.tablesource = this.filteresource;
        }
        else if (filterValue != '') {
            this.tablesource = this.filteresource.filter(e =>
                e.galleryDesc.toLowerCase().includes(filterValue.trim().toLowerCase()) ||
                e.galleryName.toLowerCase().includes(filterValue.trim().toLowerCase()) ||
                e.status.toString().toLowerCase().includes(filterValue.trim().toLowerCase()) ||
                e.createdDate.toLowerCase().includes(filterValue.trim().toLowerCase())
          );
        }
    }
    
        7
  •  0
  •   AnisNoorAli    4 年前

    使用mat输入、mat图标和多标题行尝试此一内联筛选器 https://angular-material-table-multiple-header-rows-hyfefz.stackblitz.io/

    strong text