AngularJS仅过滤某些对象

时间:2012-12-11 05:39:31

标签: angularjs javascript-framework

我的用户对象定义如下。

$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>

每当我搜索时,我都会得到姓名,年龄和性别的结果。但我想只搜索姓名和年龄,我不希望性别可以搜索。任何人都可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:21)

如果您可以有两个搜索字段

,则可以将对象作为第二个参数传递来实现此目的
<div ng-repeat="friend in user.friends | filter:{name:searchNameText, age:searchAgeText}">

否则,您需要编写自定义过滤器以对两者使用相同的字段,或者将自定义过滤器函数作为文档中描述的第三个参数传递。

http://docs.angularjs.org/api/ng.filter:filter

答案 1 :(得分:16)

我不确定这是不是你所追求的。如果您想让一个输入字段匹配多个属性,则需要将过滤函数传递给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 :(得分:1)

这不是达到你想要的最干净的方法,但它是使用标准ng-repeat过滤器完成OR过滤器的最简单方法。

<强>控制器:

$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>

答案 3 :(得分:0)

“朋友在user.friends | json | filter:{something:somethingtext}”

http://docs-angularjs-org-dev.appspot.com/api/ng.filter:json

答案 4 :(得分:0)

另一种可能的方法是创建一个聚合字段,其中包含要连接的所有字段的值,并且只对其进行过滤。