Вы можете использовать трубу для фильтрации, она будет намного чище, просто добавьте трубу перед директивой * ngFor.
@Pipe({
name: 'filter'
})
export class FilterPipe implements PipeTransform {
transform(value: any, field: string, input: string) {
if (input !== undefined && input.length >= 2) {
input = input.toLowerCase();
if (typeof value[0] === 'string') {
return value.filter(function(el: any) {
return el.toLowerCase().indexOf(input) > -1;
});
}
return value.filter(function(el: any) {
return el[field].toLowerCase().indexOf(input) > -1;
});
}
return value;
}
}
Добавьте этот канал, и в HTML, где бы вам ни понадобилось фильтровать
<div *ngFor="let val of filterJson | filter: "filterCriteria""> </div>
с точки зрения обнаружения изменений и производительности, каналы - это круто. Надеюсь, это поможет, всего наилучшего
Это не тот случай, когда реляционные базы данных очень хороши, если только вы не можете использовать полнотекстовую индексацию, а вы уже заявили, что не можете, поскольку используете InnoDB. Я бы предложил выбрать соответствующие строки и выполнить подсчет слов в коде приложения.
Я использовал технику, как описано в ссылке ниже. Использование метода length
и replace
функции MySQL.
Что-то как ПОДОБНЫЙ или REGEXP не масштабируется (если это не будет крайнее левое соответствие префикса).
Рассмотрите вместо этого использование полнотекстового индекса для того, что Вы хотите сделать.
select count(*) from yourtable where match(title, body) against ('some_word');
Что-то вроде этого должно работать:
выберите количество (*) из таблицы где имя поля REGEXP' [[: <:]] слово [[:>:]]';
Окровавленные детали находятся в руководстве MySQL, разделяют 11.4.2.
Вы можете попробовать этот извращенный способ:
SELECT
(LENGTH(field) - LENGTH(REPLACE(field, 'word', ''))) / LENGTH('word') AS `count`
ORDER BY `count` DESC