Есть ли способ использовать угловое автозаполнение материала для автозаполнения объектов с числовыми данными?

Предположим, что массив объектов,

books = [{id:1, name: 'book1'}, {id:2, name: 'book2'}];

Как я могу использовать идентификатор книги для автозаполнения?

2 ответа

Да, вы можете просто преобразовать id в строку, прежде чем фильтровать.

Рабочий стек может быть здесь. Пример основан на документации углового материала отсюда.

Я сделал два изменения в примере, чтобы он работал, чтобы вы могли фильтровать по id,

Сначала в ngOnInit Я убедился, что использовал id атрибут Book объект для передачи в _filter функция.

ngOnInit() {
  this.filteredOptions = this.myControl.valueChanges
    .pipe(
      startWith<string | Book>(''),
      map(value => typeof value === 'string' ? value : value.id),
      map(id => id ? this._filter(id) : this.options.slice())
    );
}

И в _filter сама функция просто конвертировать id в строку.

private _filter(id: number | string): Book[] {
  const filterValue = String(id);
  return this.options.filter(option => String(option.id).toLowerCase().indexOf(filterValue) === 0);
}

Гораздо проще создать угловой канал для фильтрации нужных данных. Вы сможете сохранить фильтрацию в одном месте, а не создавать еще больше кода TS. Вышеупомянутое решение вам нужно будет использовать для каждого элемента управления, и если у вас много автозаполнений на странице, это будет беспорядочно.

      import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'filterac'
})
export class FilterACPipe implements PipeTransform {

  transform(value: any[], ...args: any[]): any[] {
    if (args[0] && args[0].length) {
      value = value.filter(nextVal => {
        // Add lowercase, or can work on more complex objects.
        return (nextVal.indexOf(args[0]) > -1);
      });
    }
    return value;
  }

}

А затем в HTML:

            <mat-option *ngFor="let option of dataArray | filterac : myControl.value" [value]="option">
        {{option}}
      </mat-option>
Другие вопросы по тегам