AngularJS如何在控制器中拥有多个$ filter?

时间:2016-06-13 07:45:23

标签: angularjs

leftValue数组包含JSON信息,例如{name:' John&#39 ;, gender:' male' } 我试图在搜索栏中按名称和性别过滤信息。目前,过滤器仅按名称过滤。如何按名称和性别进行过滤?

scope.leftValue = $filter('filter')( leftValue, {
                    'name': text
                    })

我尝试了什么

scope.leftValue = $filter('filter')( leftValue, {
                    'name': text,
                    'gender': text,
                    })

4 个答案:

答案 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。