AngularJS筛选器仅针对特定对象

17

我已经定义了如下的用户对象。

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

每次我搜索时,都会得到有关姓名、年龄以及性别的结果。但我只想搜索姓名和年龄,不希望将性别作为可搜索项。有人可以告诉我如何做到这一点吗?


你能否更新你的问题并提供一个查询示例和你想要的结果。在你下面的评论中,你想要一个输入字段来搜索多个字段,但是你想输入什么类型的查询? - fredrik
5个回答

21

如果您有两个搜索字段,可以将对象作为第二个参数传递以实现此目的。

<div ng-repeat="friend in user.friends | filter:{name:searchNameText, age:searchAgeText}">
否则,您需要编写一个自定义过滤器来同时使用同一字段,或将自定义过滤函数作为第三个参数传递,文档中有描述。 http://docs.angularjs.org/api/ng.filter:filter

非常感谢你的帮助,Ricick!但是我不能有两个搜索字段。你能帮我想想如何使用同一个字段来实现吗? - Chubby Boy

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/

非常感谢您,Fredrik!是的,这正是我在寻找的!但是我在这里遇到了一个问题。我总是得到 $scope.searchText undefined。我只能获取控制器内定义的函数和变量作为 $scope 的选项,而无法在 $scope 中获取 ng-model=searchText - Chubby Boy
$scope.searchText 在输入框中没有输入内容时会是未定义的。您能否更新您正在使用的完整代码? - fredrik
有没有办法在搜索中包含特殊字符。如果我在搜索字段中输入'?',它会抛出错误'Invalid regular expression: /?/: Nothing to repeat'。 - user1153484

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>

0

0
另一种可能的方法是创建一个聚合字段,其中包含您想要连接并仅筛选的所有字段的值。

1
我不喜欢这个答案,但它绝对是最简单的。感谢您的发布。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接