0

У меня есть ретранслятор, который мне нужно отфильтровать текст, введенный в текстовое поле, так что я сделал этоAngularJS фильтр ретранслятор с несколькими значениями

<tr ng-repeat="i in filteredItems = (iso3166 | filter: {alpha_2: countryQuery})">

данные являются JSON массив объектов, $ scope.iso3166:

[{ 
    "name": "Afghanistan", 
    "alpha_2": "AF", 
    "alpha_3": "AFG", 
    "country-code": "004", 
    "iso_3166-2": "ISO 3166-2:AF", 
    "region": "Asia", 
    "sub-region": "Southern Asia", 
    "region-code": "142", 
    "sub-region-code": "034", 
    "license": "unclassified", 
    "prohibited": "unclassified", 
    "size": "unclassified" 
}, ... 

Таким образом, вы можете набрать «af» и таблицы фильтров, чтобы показать Афганистан.

Теперь мне нужно иметь то, что набрано в поле, соответствует совпадениям не только с ключом alpha_2, но и с name. Например, «аф» должен соответствовать не только «Афганистану», но и «Центральноафриканской Республике».

Я просмотрел документы с угловым 1.4.1 и увидел метод запятой, но, похоже, он выполняет сравнение И. Как и в

<tr ng-repeat="i in filteredItems = (iso3166 | filter: {alpha_2: countryQuery, name: countryQuery })">

Есть ли способ сделать сделать «или» в данном случае, так что все, что набирается фильтров любых элементов, где запрос находится в «alpha_2» или «имя»?

UPDATE: Если кому-то интересно, я завелся с помощью фильтра, как это предлагается в ответ ниже:

$scope.countryFilter = function (value) { 
    if (angular.isUndefined($scope.countryQuery) || $scope.countryQuery === '') { 
     return true; 
    } 
    return value.name.indexOf($scope.countryQuery) >= 0 || value.alpha_2.indexOf($scope.countryQuery) >= 0; 
    }; 
+0

Вы пробовали: 'я в filteredItems | фильтр: countryQuery'? – theblindprophet

+0

Да, но это будет соответствовать любому полю. Например, я не хочу сопоставлять «регион: Африка» с «af». Просто поля «alpha_2» или «name». – Steve

ответ

1

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

<tr ng-repeat="i in filteredItems = (iso3166 | filter: filterFn)"> 

В контроллере:

scope.filterFn = function(item) { 
    if(//item meets criteria) { 
     //returning true will put the item into the ng-repeat data 
     return true; 
    } 
    return false; 
} 
+0

Я закончил писать фильтр. Я все еще предпочитаю делать это в html, но это было быстрее. – Steve

0

Вы можете применить свойства к нг-повторить фильтр, как это:

https://jsfiddle.net/pzek3tmy/

контроллер

function Controller($scope) { 
     var vm = this; 

     vm.regions = [{ 
     "name": "Afghanistan", 
     "alpha_2": "AF", 
     "alpha_3": "AFG", 
     "country-code": "004", 
     "iso_3166-2": "ISO 3166-2:AF", 
     "region": "Asia", 
     "sub-region": "Southern Asia", 
     "region-code": "142", 
     "sub-region-code": "034", 
     "license": "unclassified", 
     "prohibited": "unclassified", 
     "size": "unclassified" 
     }, { 
     "name": "Germany", 
     "alpha_2": "GN", 
     "alpha_3": "AFG", 
     "country-code": "004", 
     "iso_3166-2": "ISO 3166-2:AF", 
     "region": "Asia", 
     "sub-region": "Europe", 
     "region-code": "143", 
     "sub-region-code": "034", 
     "license": "unclassified", 
     "prohibited": "unclassified", 
     "size": "unclassified" 
     }]; 
    } 

HTML

<div ng-controller="Controller as ctrl"> 
    <input type="text" ng-model="region_filter"> 
    <ul> 
    <li ng-repeat="region in ctrl.regions | filter:{'alpha_2':region_filter} | filter:{'name':region_filter}">{{region.name}}  </li> 
    </ul> 
</div> 
+0

Это приведет к возврату совпадений, совпадающих как с (И), так и с вопросом (как). В вашем примере «Германия» не вернет результат Германии. –

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