2014-11-10 2 views
0

Im используя angularJS для создания списка элементов. Теперь я хочу отфильтровать, чтобы одновременно выполнять поиск в нескольких столбцах. Например, если я ищу «Боб», будут показаны все столбцы, содержащие «Боб», а затем я продолжу поиск «Боб 073», все столбцы, содержащие имя «Боб», и номер телефона, который содержит «073», покажут ,Фильтровать несколько столбцов одновременно

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

app.filter('appFilter', function() { 
    return function (data, search) { 
     if (!search) { 
      return data; 
     } else { 
      var term = search; 
      var termsArray = term.split(' '); 

      return data.filter(function(item){ 
       return item.name.indexOf(termsArray[0]) > -1 && item.phone.indexOf(termsArray[1]) > -1; 
      }); 
     } 
    } 
}); 

<input type="search" ng-model="search"> 
<div ng-repeat="item in items | appFilter:search)"> 
    {{item.name}}, {{item.phone}} 
</div> 

Надеюсь, вы понимаете, что я имею в виду.

Спасибо.

+0

Может быть, вы должны использовать || вместо && –

+0

, пожалуйста, отправьте пример на список ведьм, в котором вы запускаете 'ng-repeat' с' appFilter'. –

+0

@Alexander Это не работает, оба должны быть истинными, иначе он будет искать только одну из строк. – Inzajt

ответ

0
myApp.filter('filterMultiple', ['$filter', function ($filter) { 
return function (items, keyObj) { 
    var filterObj = { 
     data: items, 
     filteredData: [], 
     applyFilter: function (obj, key) { 
      var fData = []; 
      if (this.filteredData.length == 0) 
       this.filteredData = this.data; 
      if (obj) { 
       var fObj = {}; 
       if (!angular.isArray(obj)) { 
        fObj[key] = obj; 
        fData = fData.concat($filter('filter')(this.filteredData, fObj)); 
       } else if (angular.isArray(obj)) { 
        if (obj.length > 0) { 
         for (var i = 0; i < obj.length; i++) { 
          if (angular.isDefined(obj[i])) { 
           fObj[key] = obj[i]; 
           fData = fData.concat($filter('filter')(this.filteredData, fObj)); 
          } 
         } 

        } 
       } 
       if (fData.length > 0) { 
        this.filteredData = fData; 
       } 
      } 
     } 
    }; 

    if (keyObj) { 
     angular.forEach(keyObj, function (obj, key) { 
      filterObj.applyFilter(obj, key); 
     }); 
    } 

    return filterObj.filteredData; 
} 
}]); 

Использование:

arrayOfObjectswithKeys | filterMultiple:{key1:['value1','value2','value3',...etc],key2:'value4',key3:[value5,value6,...etc]} 
+0

[link] (http://jsfiddle.net/9F89Q/109/) –

+0

Это помогло мне создать решение для использования поисковых машин. Благодаря! – Inzajt

+0

приветствуется приятель .. –

Смежные вопросы