AngularJS фильтрует только определенные объекты
У меня есть пользовательский объект, указанный ниже.
$scope.user = [{id: 1, friends:
[
{name: 'John', age: 21, sex: 'M'},
{name: 'Brad', age: 32, sex: 'M'}
]
}]
У меня есть следующий код:
<input type="text" ng-model="searchText">
<div ng-repeat="friend in user.friends | filter:searchText">
{{friend.name}} {{friend.age}}
</div>
Здесь, когда я ищу, я получаю результаты для имени, возраста, а также пола. Но я хочу искать только имя и возраст, и я не хочу, чтобы секс был доступен для поиска. Может ли кто-нибудь помочь мне с тем, как я могу это достичь?
Ответы
Ответ 1
Я не уверен, что это то, что вам нужно. Если вы хотите, чтобы одно поле ввода соответствовало нескольким свойствам, вам нужно передать функцию фильтра, которая будет передана в filter
.
$scope.user = {id: 1, friends: [{name: 'John', age: 21, sex: 'M'}, {name: 'Brad', age: 32, sex: 'M'}, {name: 'May', age: 64, sex: 'F'}]};
$scope.searchFilter = function (obj) {
var re = new RegExp($scope.searchText, 'i');
return !$scope.searchText || re.test(obj.name) || re.test(obj.age.toString());
};
Вот пример скрипки
http://jsfiddle.net/fredrik/26fZb/1/
Ответ 2
Вы можете передать объект в качестве второго параметра для достижения этого, если у вас есть два поля поиска
<div ng-repeat="friend in user.friends | filter:{name:searchNameText, age:searchAgeText}">
В противном случае вам нужно будет написать настраиваемый фильтр, чтобы использовать одно и то же поле для обоих, или передать пользовательскую функцию фильтра в качестве третьего параметра, который описан в документах.
http://docs.angularjs.org/api/ng.filter:filter
Ответ 3
Это не самый чистый способ выполнить то, что вы хотите, но это самый простой способ выполнить фильтр ИЛИ с использованием стандартного фильтра ng-repeat.
Контроллер:
$scope.user = [{id: 1, friends:
[
{name: 'John', age: 21, sex: 'M'},
{name: 'Brad', age: 32, sex: 'M'}
]
}]
$scope.buildSearchData = buildSearchData;
function buildSearchData(friend){
return friend.name + ' ' + friend.age;
}
HTML
<input type="text" ng-model="searchText">
<div ng-repeat="friend in user.friends | filter:{searchData:searchText}"
ng-init="friend.searchData = buildSearchData(friend)">
{{friend.name}} {{friend.age}}
</div>
Ответ 4
"friend в user.friends | json | filter: {something: somethingtext}"
http://docs-angularjs-org-dev.appspot.com/api/ng.filter:json
Ответ 5
Еще один возможный подход - создать поле агрегата, содержащее значения всех полей, которые вы хотите фильтровать, на конкатенированном и только фильтровать на них.