Angular Material - фильтр Custom Column и фильтр по умолчанию не работают вместе

Фильтр столбца работает абсолютно нормально, но фильтр по умолчанию (поиск по полю ввода) не работает вообще. Я пробовал несколько вещей, но ничего не получилось. Я хочу, чтобы мое поле ввода имело поведение по умолчанию для поиска двух столбцов, то есть столбца allAssociates и отдела вместе с фильтрами отдельных столбцов. Он также не выдает никаких ошибок. Ссылка на пользовательский фильтр столбцов взята из, поэтому я не включил здесь: https://www.freakyjolly.com/angular-material-table-custom-filter-using-select-box/#Adding_Filters_on_Table

Метод filterTable не работает должным образом. Буду признателен за любые предложения.

Полный код: https://stackblitz.com/edit/angular-material-b6qdyt?file=app%2Fapp.component.html

Поделился фрагментом ниже:

HTML

<div>
  <mat-form-field 
    *ngFor="let filter of filterSelectObj" 
    style="margin-left: 15px;">
    <mat-label> Filter {{filter.name}} </mat-label>
    <select 
      matNativeControl 
      name="{{filter.columnProp}}" 
      [(ngModel)]="filter.modelValue" 
      (change)="filterChange(filter,$event)">
      <option value=""> All </option>
      <option 
        [value]="item" 
        *ngFor="let item of filter.options">
        {{item}}
      </option>
    </select>
  </mat-form-field>
  <mat-icon>search</mat-icon>
  <input 
    type="text" 
    placeholder="All Associates/Dept" 
    #input 
    (keyUp)="filterTable($event.target.value)"> &nbsp;
  <button 
    mat-stroked-button
    color="warn" 
    (click)="resetFilters(input)">
    Reset
  </button>
</div>

Файл TS:

ngOnInit() {
  //fetch data from Service
  const deptData = this.deptService.getData();
  this.dataSource = new MatTableDataSource(deptData);
  this.dataSource.filterPredicate = this.createFilter();
  this.filterSelectObj.filter((o) => {
    o.options = this.getFilterObject(deptData, o.columnProp);
  });
}

filterTable(input: string) {
  this.dataSource.filterPredicate =
    (data: DepartmentData, f: string) => !f || (data.allAssociates || data.dept) == f;
  input = input.trim(); // Remove whitespace
  input = input.toLowerCase(); // MatTableDataSource defaults to lowercase matches
  this.dataSource.filter = input;
}

person sandhu    schedule 19.05.2021    source источник
comment
Какую версию Angular и Angular Material вы используете?   -  person SiddAjmera    schedule 19.05.2021
comment
материал - 11.2.12 и угловой - 11.2.13   -  person sandhu    schedule 19.05.2021
comment
Предоставленный вами stackblitz работает с Angular V4 и Material v2 ????????‍♂️   -  person SiddAjmera    schedule 19.05.2021


Ответы (1)


Хорошо. Итак, две проблемы, которые я обнаружил в вашей реализации.

  1. В шаблоне вы привязываетесь к (keyUp), когда фактическое имя события для привязки — (keyup).

  2. Возникла проблема с вашей функцией предиката. Должно было быть так:

    this.dataSource.filterPredicate = (данные: DepartmentData, f: строка) =› !f || data.allAssociates.toLowerCase().includes(f) || data.dept.toLowerCase().includes(f.toLowerCase());

Устранение этих двух проблем должно заставить его работать на вас.

Вот Работающий Образец StackBlitz для вашей ссылки.

person SiddAjmera    schedule 19.05.2021
comment
Большое спасибо, теперь все работает нормально.. Еще раз быстро подумайте, можете ли вы помочь. Метод сброса не сбрасывает. Выберите параметр «Все» в пользовательском интерфейсе.. Если вы можете определить проблему. - person sandhu; 19.05.2021
comment
Готово :) @SiddAjmera - person sandhu; 19.05.2021