2013-11-29 4 views
29

У меня есть небольшое угловое приложение так:Угловая фильтр точно на ключ объекта

HTML

<body ng-app> 
    <div ng-controller="Ctrl"> 
    <div ng-repeat="user in users | filter:1"> 
     <span>{{ user.username }}, {{ user.id }}</span> 
    </div> 
    </div> 
</body> 

app.js

function Ctrl($scope) { 
    $scope.users = [ 
    {"id":1,"username":"simon",}, 
    {"id":8,"username":"betty",}, 
    {"id":14,"username":"archie",}, 
    {"id":3,"username":"jumbo1"}, 
    ] 
} 

выход

simon, 1 
archie, 14 
jumbo1, 3 

Что я хочу сделать, это фильтр точный совпадение для фильтра и фильтра только в поле id.

В принципе, я хочу выход быть:

выхода

simon, 1 

Я использую Угловые 1.2.

+0

возможно дубликат [точного фильтра в угловых] (http://stackoverflow.com/questions/18242520/exact-filter-in-angu lar) – Stewie

ответ

77

В Угловое 1.1.3 или более поздней версии вы можете использовать следующие:

<div ng-repeat="user in users | filter:{'id': 1}:true"> 

{'id': 1} говорит только сравнить с полем id. Это заставляет вас:

simon, 1 
archie, 14 

:true говорит: "точное совпадение", в результате:

simon, 1 

Вот что рабочая: http://jsfiddle.net/AM95H/

Для фильтрации по списку значений, если у вас есть в переменной области, я бы добавил специальный фильтр в ваш файл JS:

$scope.filterValues = [1,8]; 
$scope.myFilter = function(value) { 
    return ($scope.filterValues.indexOf(value.id) !== -1); 
}; 

Используется так:

<div ng-repeat="user in users | filter: myFilter"> 

Для фильтрации по списку параметров мы создадим свой собственный фильтр. В этом случае мы получим вызов один раз со всеми входными значениями для проверки, а не один раз за значение.

Таким образом, первым параметром, который мы получим, является массив входных значений (пользователей в вашем случае), а вторым параметром будет параметр, который мы передаем ([1,8]). Затем мы создадим выходной массив и добавим (push) любые элементы во входном потоке, соответствующие одному из filterValues. И верните выходной массив.

myApp.filter('myFilter', function() { 
    return function(inputs,filterValues) { 
     var output = []; 
     angular.forEach(inputs, function (input) { 
     if (filterValues.indexOf(input.id) !== -1) 
      output.push(input); 
     }); 
     return output; 
    }; 
}); 

И использовать его как это:

<div ng-repeat="user in users | myFilter:[1,8]"> 

Вот пример этого: http://jsfiddle.net/AM95H/2/

+1

Префект отвечает. Я приму. как расширение, что, если я хочу, чтобы аргумент фильтра был списком целых чисел, возможно ли это? Я попробовал 'filter: {'id': [1,8]}', но это не работает :( –

+0

Я бы использовал настраиваемый фильтр, чтобы иметь несколько допустимых точных совпадений. Я обновил это. – KayakDave

+0

Еще раз спасибо! Отличный ответ. –

6

основе https://docs.angularjs.org/api/ng/filter/filter

Фильтр на Шаблон:

<tr ng-repeat="friendObj in friends | filter:id:true"> 
    <td>{{friendObj.name}}</td> 
    <td>{{friendObj.phone}}</td> 
</tr> 

фильтр на контроллере (с $ пар)

$scope.friendObj = $filter('filter')(data.friends, { id: parseInt($stateParams.friendId) }, true)[0]; 
0

Укажите ключ (свойство) объект в фильтре, на котором вы хотите применить фильтр:

//Suppose Object 
var users = [{ 
    "firstname": "RAM", 
    "lastname": "KUMAR", 
    "Address": "HOUSE NO-1, Example Street, Example Town" 
    }, 
    { 
    "firstname": "SHAM", 
    "lastname": "RAJ K", 
    "Address": "HOUSE NO-1, Example Street, Example Town" 
}] 

Но вы хотите применить фильтровать только по FirstName

<input type = "text" ng-model = "f_n_model"/> 
<div ng-repeat="user in users| filter:{ firstname: f_n_model}"> 
Смежные вопросы