Пользовательский фильтр Angular Js Smart Table для поиска многословного фильтра с использованием пробела

Я борюсь с пользовательской директивой фильтра в течение последних пяти часов. Я новичок в angularjs. У меня есть таблица со всеми потребностями, кроме фильтра. я хочу, чтобы глобальный многострочный фильтр использовал пробел в одном текстовом поле поиска. Вот мой код:

app.filter('multiWordFilter', ['$filter', function ($filter) {

    // function that's invoked each time Angular runs $digest()
    return function (input, predicate) {
        var searchValue = predicate['$'];
        //console.log(searchValue);
        var customPredicate = function (value, index, array) {
            console.log(value);
            // alert(searchValue);

            // if filter has no value, return true for each element of the input array
            if (typeof searchValue === 'undefined') {
                return true;
            }
            var propList = Object.getOwnPropertyNames(value) || [];
            var splitValue = (searchValue || '').split(' ');
            var resultArray = [];
            for (var i = 0; i < propList.length; i++) {
                var prop = propList[i];
                if (typeof value[prop] !== 'string')
                    continue;

                for (var j = 0; j < splitValue.length; j++) {
                    var searchText = splitValue[j];
                    if (!searchText)
                        continue;

                    var index = (String)(value[prop]).toLowerCase().indexOf(searchText.toLowerCase());
                    if (index > -1) {
                        trueList.push(true);
                        break;
                    }
                }
            }
            return trueList.length
        }
        return $filter('filter')(input, customPredicate, false);
    }
}])

приведенный выше код работает только для поиска одной строки, а также я пытаюсь разделить несколько строк с пробелом для ex |Name|ContactNo| |:Асраф|8765270810| |:Рам|8765270810|

поисковое слово похоже на 8754270810 Asraf

возвращать только первый результат поиска, а не второй.

я ожидаю

поисковое слово типа 8754270810 возвращает две записи поисковое слово типа 8754270810 Asraf возвращает одну запись

Заранее спасибо, ребята.


person Mohideen Asraf    schedule 09.12.2020    source источник
comment
Попробуй это. stackoverflow.com/a/19405684/5781575   -  person tbone849    schedule 09.12.2020
comment
@ tbone849 Спасибо за ваш комментарий, но, возможно, он не работает с несколькими свойствами, а также с несколькими словами, разделенными пробелом, при поиске в одной строке.   -  person Mohideen Asraf    schedule 10.12.2020
comment
Хм. Взгляните на это. stackoverflow.com/a/31370761/5781575   -  person tbone849    schedule 10.12.2020
comment
@ tbone849, большое спасибо, небольшое изменение в моем коде, чтобы добиться того, чего я ожидаю. просто используйте searchCount, который равен количеству разделенных значений.   -  person Mohideen Asraf    schedule 16.12.2020


Ответы (1)


Я нашел решение выше моей проблемы.

app.filter('multiWordFilter', ['$filter', function ($filter) {
    // function that's invoked each time Angular runs $digest()
    return function (input, predicate) {
        var searchValue = predicate['$'];
        var customPredicate = function (value, index, array) {

            // if filter has no value, return true for each element of the input array
            if (typeof searchValue === 'undefined') {
                return true;
            }
            var propList = Object.getOwnPropertyNames(value) || [];
            var splitValue = ((String)(searchValue).trim() || '').split(' ');

            if (!splitValue.length)
                return true;

            var searchCount = 0;
            for (var j = 0; j < splitValue.length; j++) {
                var searchText = splitValue[j];
                if (!searchText)
                    continue;
                for (var i = 0; i < propList.length; i++) {
                    var prop = propList[i];
                    if (typeof value[prop] !== 'string')
                        continue;

                    var index = (String)(value[prop]).toLowerCase().indexOf(searchText.toLowerCase());
                    if (index > -1) {
                        searchCount++;
                        break;
                    }
                }
            }
            return (searchCount == splitValue.length)
        }
        return $filter('filter')(input, customPredicate, false);
    }
}])

Здесь, когда количество разделенных значений текста поиска и количество искомых равны, тогда доступны только совпадающие записи.

В моем случае предположим, что сетка имеет 10 строк, текст поиска: «Есть собака». Теперь, что на самом деле произойдет, сначала отфильтруйте с помощью Dog, теперь у нас есть 7 строк, а затем теперь отфильтруйте с помощью eat в предыдущем фильтре, где мы уже получили 7 строк, наконец, мы получили 4 ряда. это результат, который я действительно хочу.

Спасибо, ребята, которые тратят свое драгоценное время на мой вопрос.

person Mohideen Asraf    schedule 16.12.2020