Вы можете сделать это, используя трубу из Angular
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'highlight',
pure: false
})
export class HighlightPipe implements PipeTransform {
transform(items: any, search: string, clip: boolean): any {
const regex = new RegExp(search, 'ig');
if(Array.isArray(items) && search) {
for(let item of items) {
item.highlight = regex.test(item.label);
}
}
return clip ? items.filter(item => item.highlight) : items;
}
}
Я передал поисковый запрос в трубе, и полный массив всегда возвращался из трубы, но с использованием регулярного выражения или, возможно, вашего пользовательскогоЛогика поиска: добавьте еще один атрибут к элементу списка highlight
логический, который имеет значение true, если ваша логика говорит, что он соответствует элементу, иначе false
Я изменил массив элементов с string[]
до {label:string, highlight?:boolean}[]
, чтобы он соответствовализменение канала, поэтому вместо этого мы используем массив как
items: {label:string, highlight?:boolean}[] = [
{label: 'INDIA'},
{label: 'USA'},
{label: 'RUSSIA'},
{label: 'UK'},
{label: 'ITALY'},
];
Теперь для всех помещаем его в шаблон
<div
*ngFor="let item of items | highlight: search"
[ngClass]="{highlight: item.highlight, card: true}"
>
{{item.label}}
</div>
Здесь при поиске, совпадает ли он с каким-либо элементомМассив from items будет иметь атрибут highlight:true
как true, а также добавляет класс с именем 'highlight` к вашей существующей карте div.card, поэтому в css определение карты подсветки как
.card.highlight{
background-color: yellow;
}
Обратите внимание, что мы отправляемпоисковый термин для канала, который мы создали в качестве аргумента, поэтому мы должны определить переменную как переменную уровня класса, которая устанавливается, когда мы нажимаем поиск в вашем методе devicesearch, который вы уже вызываете.
search: string;
devicesearch(input) {
this.search = input;
}
Edit 2:
Если вы хотели обрезанный массив, вы можете использовать Pipe в своем классе, чтобы получить обрезанный массив
search: string;
searchedItems: any[];
highlightPipe = new HighlightPipe();
devicesearch(input) {
this.search = input;
this.searchedItems = this.highlightPipe.transform(this.items, input, true);
// only names --> const names = this.searchedItems.map(item => item.label);
}
Обновлен StackBlitz для вашей справки: https://stackblitz.com/edit/angular-usswkn