Несколько фильтров на MatTable - PullRequest
0 голосов
/ 24 августа 2018

Я пытался применить многостолбцовую фильтрацию, то есть ввод текста в заголовках столбцов будет фильтровать только содержимое столбца. До сих пор мне удавалось заставить его работать, переопределяя filterPredicate из MatTableDataSourceно как только я переопределяю фильтрацию по умолчанию, которая по столбцам больше не работает.

export class TableFilteringExample implements OnInit
{
  displayedColumns: string[] = ['position', 'name', 'weight', 'symbol'];
  dataSource = new MatTableDataSource(ELEMENT_DATA);

  positionFilter = new FormControl();
  nameFilter = new FormControl();

  filteredValues =
  {
    position: '',
    name: '',
    weight: '',
    symbol: ''
  };

  ngOnInit()
  {
    this.positionFilter.valueChanges.subscribe((positionFilterValue) =>
    {
      this.filteredValues['position'] = positionFilterValue;
      this.dataSource.filter = JSON.stringify(this.filteredValues);
    });

    this.nameFilter.valueChanges.subscribe((nameFilterValue) =>
    {
      this.filteredValues['name'] = nameFilterValue;
      this.dataSource.filter = JSON.stringify(this.filteredValues);
    });

    this.dataSource.filterPredicate = this.customFilterPredicate();
  }

  applyFilter(filterValue: string)
  {
    this.dataSource.filter = filterValue.trim().toLowerCase();
    this.dataSource.filter = filterValue;
  }

  customFilterPredicate()
  {
    const myFilterPredicate = function(data: PeriodicElement, filter: string): boolean
    {
      let searchString = JSON.parse(filter);

      return data.position.toString().trim().indexOf(searchString.position) !== -1 && data.name.toString().trim().toLowerCase().indexOf(searchString.name)!== -1;
    }

    return myFilterPredicate;
  }
}

Что мне нужно, так это то, что после применения фильтра по столбцам фильтр по умолчанию должен обновить существующие критерии фильтра и вернуть дополнительно отфильтрованныйданные.

StackBlitz

1 Ответ

0 голосов
/ 25 августа 2018

Я думаю, вы просто забыли вызвать toLowerCase() для searchString.name

data.name.toString (). Trim (). ToLowerCase (). IndexOf (searchString.name.toLowerCase ())!== -1;


РЕДАКТИРОВАТЬ: Один из подходов заключается в создании поля глобального фильтра в классе компонентов.

globalFilter = '';

<mat-form-field>
  <input matInput [ngModel]="globalFilter" (ngModelChange)="applyFilter($event)" placeholder="Filter">
</mat-form-field>

applyFilter(filter) {
    this.globalFilter = filter;
    this.dataSource.filter = JSON.stringify(this.filteredValues);
}

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

  customFilterPredicate() {
    const myFilterPredicate = (data: PeriodicElement, filter: string): boolean => {
      var globalMatch = !this.globalFilter;

      if (this.globalFilter) {
        // search all text fields
        globalMatch = data.name.toString().trim().toLowerCase().indexOf(this.globalFilter.toLowerCase()) !== -1;
      }

      if (!globalMatch) {
        return;
      }

      let searchString = JSON.parse(filter);
      return data.position.toString().trim().indexOf(searchString.position) !== -1 &&
        data.name.toString().trim().toLowerCase().indexOf(searchString.name.toLowerCase()) !== -1;
    }
    return myFilterPredicate;
  }

Вот рабочее приложение: https://stackblitz.com/edit/angular-hbakxo-5jeaic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...