Фильтр по логическому значению angular

я пытаюсь сделать фильтр по статусу пользователя, «Ативо» для онлайн и «Инативо» для офлайн, но фильтрация по строке вызывает у меня некоторую головную боль, потому что когда я набираю «ативо», все офлайн-пользователи все равно отображаются, потому что слово «ативо» существует в «инативо». Поэтому я хотел придать ложное значение «инативо» и истинное значение «ативо».

Любые советы о том, как мне это сделать? Я все еще использую фильтр, чтобы показать «Ativo» и «Inativo» в качестве параметров в списке данных, но при выборе он должен отправлять истинное или ложное значение в функцию фильтра.

Это html и функция на ts, которую я создал

<input type = "text" list = "status" placeholder = "Status" (keyup) = "updateFilter($event)" id = "stat">   
    <datalist id = "status">
      <option>Ativo</option>
      <option>Inativo</option>
    </datalist>
updateFilter(event: Event) {
    this.filterValue = (event.target as HTMLInputElement).value;    
    this.dataSource.filter = this.filterValue.trim().toLowerCase();
    console.info(this.dataSource.filter);

    if (this.dataSource.paginator) {
      this.dataSource.paginator.firstPage();
    }
  }

Если у вас возникла проблема со строкой ativo в inativo, значит, вы, вероятно, пытались использовать .includes('ativo')? Вам не нужно использовать этот метод — вы можете просто проверить равенство, что-то вроде user.status == 'ativo'.

Misha Mashina 23.03.2022 14:13
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
45
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Angular Material предоставляет способ сказать, как фильтр должен применяться к данным с помощью метода filterPredicate: https://material.angular.io/components/table/api#MatTableDataSource

Предоставление функции стрелки для вашего источника данных, которая говорит, что значения должны быть строго равными, а не одинаковыми, должно решить вашу проблему.

this.datasource.filterPredicate = (data: YourDataType, filter: string) => {
  return data.status === filter;
};

Это сработало очень хорошо, спасибо :)

Paula Bremenkamp 25.03.2022 13:18

Рад, что помог :)

Ocunidee 25.03.2022 14:05

Во-первых, если ваш фильтр имеет строгое значение, вам следует использовать не datalist, а select. Он работает так же, но не позволяет пользователю вводить данные.

Теперь нет причин, по которым вы сталкиваетесь с такой проблемой. Просто проверьте, достаточно ли (event.target as HTMLInputElement).value === 'ativo'.

Я рекомендую создать перечисление, чтобы избежать волшебной строки в вашем коде, поэтому вместо 'ativo' у вас будет UserStatus.ativo.

Вы можете использовать регулярное выражение для этого:

var myString = 'ativio';
var myString2 = 'inativio';

new RegExp('\bativio\b').test(myString); // true

new RegExp('\bativio\b').test(myString2); // false

Другие вопросы по теме