Подтвердить что ты не робот

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>

Здесь, когда я ищу, я получаю результаты для имени, возраста, а также пола. Но я хочу искать только имя и возраст, и я не хочу, чтобы секс был доступен для поиска. Может ли кто-нибудь помочь мне с тем, как я могу это достичь?

4b9b3361

Ответ 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>

Ответ 5

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