Мне удалось создать рабочую демонстрацию этого.Мой класс HighlightSearchPipe
выглядит следующим образом:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'highlightSearch'
})
export class HighlightSearchPipe implements PipeTransform {
transform(value: string, search: string): string {
const valueStr = value + ''; // Ensure numeric values are converted to strings
return valueStr.replace(new RegExp('(?![^&;]+;)(?!<[^<>]*)(' + search + ')(?![^<>]*>)(?![^&;]+;)', 'gi'), '<strong class="your-class">$1</strong>');
}
}
Я изменил класс Typescript, который содержит функцию applyFilter()
, следующим образом:
i.Добавлена переменная класса filterText
, чтобы текст фильтра, набранный пользователем, был доступен в HTML.Эта переменная обновляется в функции applyFilter()
ii.Удален вызов this.highlight.transform(this.dataSource.filter, this.searchKeyword);
в applyFilter()
@Component({
...
})
export class TableFilteringExample {
...
filterText = '';
applyFilter(filterValue: string) {
this.filterText = filterValue.trim();
this.dataSource.filter = this.filterText.toLowerCase();
}
}
В компоненте HTML я изменил способ рендеринга ячеек с:
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Name </th>
<td mat-cell *matCellDef="let element">{{element.name}}</td>
</ng-container>
на:
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Name </th>
<td mat-cell *matCellDef="let element" [innerHTML]="element.name | highlightSearch: filterText"></td>
</ng-container>
Таким образом, значение ячейки (в данном случае element.name
) может отображать HTML.Для преобразования значения и выделения его части, соответствующей фильтру, используется канал highlightSearch
.