Передача аргументов пользовательским фильтрам angularjs

У меня есть global filter, который фильтрует данные на основе ввода текста.

<search-box ng-model = "vm.filter.keyword"></search-box>

И мы используем такой фильтр

<tr ng-repeat = "group in vm.groups | searchGlobal:vm.filter.keyword

Мой фильтр выглядит так:

.filter('searchGlobal',
    function searchGlobal () {
        return function searchGlobal (searchValArr,filterText) {
            var filteredData = [];
            for(var i = 0; i <searchValArr.length; i++) {
                if (searchValArr[i].name.toLowerCase().indexOf(filterText.toLowerCase()) !== -1 || 
                searchValArr[i].id.indexOf(filterText) !== -1) {
                    filteredData.push(searchValArr[i]);
                }                        
            }
            return filteredData;
        };
    });

Вот в чем проблема.

Поля для поиска могут просто не бытьname и id.

В некоторых случаях они могут бытьname, phone_numbers,

в некоторых случаяхname, age, refNumbers.

Как мне соответствующим образом обработать логику сценария внутри фильтра?

Вы передаете второй параметр для просмотра searchGlobal:vm.filter.keyword? Я видел только один параметр.

Tan Duong 06.04.2018 11:37

@TanDuong Первым параметром всегда является набор данных ngRepeat, а вторым - vm.filter.keyword

StrugglingCoder 06.04.2018 11:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
38
2

Ответы 2

Вы можете добавить еще один параметр для проверки желаемого свойства

<tr ng-repeat = "group in vm.groups | searchGlobal:vm.filter.keyword:vm.filter.listKeys

.filter('searchGlobal',
function searchGlobal () {
    return function searchGlobal (searchValArr,filterText, listKeys) {
        var filteredData = [];
        var listIdAdd = [];

        if (angular.isUnDefined(listKeys) || !angular.isArray(listKeys)) {
            listKeys = ['name', 'id'];
        }
        for(var i = 0; i <searchValArr.length; i++) {
            for (var j = 0; j < listKeys.length; j++) {
                if (searchValArr[i][listKeys[j]].toLowerCase().indexOf(filterText.toLowerCase()) !== -1 &&
                    listIdAdd.indexOf(searchValArr[i].id === -1)) {
                    filteredData.push(searchValArr[i]);
                    listIdAdd.push(searchValArr[i].id);
                }
            }
        }
        return filteredData;
    };
});

Надеюсь на эту помощь

Вы можете создать фильтр, который будет проверять, содержит ли какой-либо из ключей объекта ключевое слово.

Я создал простой пример здесь.

Функция фильтра выглядит следующим образом, обратите внимание, что она использует некоторые современные функции JS, такие как Object.values и String.includes, которые можно заменить, если требуется поддержка старых браузеров.

angular.module("myApp")
  .filter("searchGlobal", function(){
    return function(data, keyword){
      // Return a filtered array of items in the initial array
      return data.filter(function(obj){
        // Check if any (some) of the object keys contains the keyword
        return Object.values(obj).some(function(value){
          return value.includes(keyword);
        });
      });
    };
  });

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