leftValue数组包含JSON信息,例如{name:' John&#39 ;, gender:' male' } 我试图在搜索栏中按名称和性别过滤信息。目前,过滤器仅按名称过滤。如何按名称和性别进行过滤?
scope.leftValue = $filter('filter')( leftValue, {
'name': text
})
我尝试了什么
scope.leftValue = $filter('filter')( leftValue, {
'name': text,
'gender': text,
})
答案 0 :(得分:1)
我觉得你有点混淆了。您可以像第二个示例一样指定对象映射。当你这样做时docs说明了这一点。
对象:模式对象可用于过滤特定属性 数组包含的对象。例如
{name:"M", phone:"1"}
谓词将返回具有属性名称的项目数组 包含“M”和包含“1”的财产电话。一个特殊的财产 可以使用名称$
(如{$:"text"}
)来接受任何匹配 对象的属性或其嵌套对象属性。那是 相当于简单的子串与所描述的字符串匹配 以上。可以通过在字符串前加上!来取消谓词。 例如,{name: "!M"}
谓词将返回一个项目数组 财产名称不包含"M"
。
这里要带走的重要一点是第二句和and
。意味着为了匹配,在您的情况text
中,字符串必须匹配地图中指定的所有属性。
如果名称仅为male
,则仅搜索John
将不会匹配。但搜索ma
会返回以下记录:
{
name: 'mark',
gender: 'male'
}
仅供参考,你也可以通过视图搜索对象图,但它有相同的限制。
据说可以使用$
通配符给它一个逗号分隔的属性列表。这将与任何属性进行or
匹配。
{
$: 'name,gender'
}
此处的捕获是所有属性都将针对它们检查相同的值。
这是fiddle showing他们的行动。
其他答案很好地总结了替代方案,只是觉得他们缺乏解释发生的事情及其背后的原因。
答案 1 :(得分:0)
您可以使用过滤器链。
var result1 = $filter('filter')( leftValue, {'name': text })
var result2 = $filter('filter')( result1 , {'gender': text })
答案 2 :(得分:0)
我认为我们在html中做得更好。
<tr ng-repeat="player in players | filter:{id: player_id, name:player_name} | filter:ageFilter">
$scope.ageFilter = function (player) {
return (player.age > $scope.min_age && player.age < $scope.max_age);
}
您可以在此链接中查看他们的方式:
AngularJS multiple filter with custom filter function
答案 3 :(得分:0)
我感谢您在控制器中说过,但只是为了给您提供选项,您可以在HTML中完成所有操作。
{{yourJSONLinkedToScope | filter: name | filter: gender}}
其中名称和性别是输入框中的ng-model。