详细说明filter : expression : comparator 的工作原理。
这是过滤器语法:
data | filter: expression : comparator
AngularJS 内置的filter 函数在其传递的数据上提供不区分大小写的子字符串搜索,当表达式是字符串或受过滤器约束的对象的属性时,与expression 进行比较。 comparator 使您能够进一步细化过滤器。如果您只是将comparator 指定为true,它将确保只返回与expression 完全匹配的项目。更灵活的方法是将comparator 指定为返回predicate function 的函数。
示例
以下数据在视图的$scope 中作为人员公开:
var people = [
{name:'John Jones',location:'Peterborough'},
{name:'Angela Atkinson',location:'Jersey'},
{name:'Peter Peterjon',location:'Attleborough'}
];
我们将在视图上设置一个简单的输入搜索框,将其作为过滤器表达式参数提供:
<input type="text" ng-model="searchText" placeholder="Search People">
1) 没有比较器
搜索结果将在我们调用过滤器的地方输出:
<p ng-repeat="person in people | filter : searchText">{{person.name}} {{person.location}}</p>
如果我们在搜索框中输入“J”,因为所有条目在某处都有一个 j,结果仍然会显示所有 3 个条目。
演示:https://plnkr.co/edit/VID2CAKvUI5mjgKLImaI?p=preview
2) 比较器为true
<p ng-repeat="person in people | filter : searchText : true">{{person.name}} {{person.location}}</p>
输入“J”将不会显示任何结果,因为没有完全是 J 的字段。只有输入以下任何内容(区分大小写),我们才会得到结果:
- 约翰·琼斯
- 彼得伯勒
- 安吉拉·阿特金森
- 球衣
- 彼得·彼得乔恩
- 阿特尔伯勒
演示:https://plnkr.co/edit/hhw2u03egXsUo7IyGc1w?p=preview
3) 比较器为function
我们会将一个名为customComparator 的自定义比较器predicate function 附加到控制器的$scope。我将其设置为需要完全匹配,但不再区分大小写。我们使用它如下:
<p ng-repeat="person in people | filter : searchText : customComparator">{{person.name}} {{person.location}}</p>
演示:https://plnkr.co/edit/Iy9r9bLQQdzefuzUv0TD?p=preview
4) 自定义过滤器
我们可以创建一个自定义过滤器并将| 插入其中,而不是使用带有表达式和比较器的内置filter。与上面的 WITH COMPARATOR AS function 完全相同的自定义过滤器可能如下所示:
.filter('customFilter',[function() {
var customFilter = function(arr,searchText){
if(! searchText)
return arr;
return arr.filter(function(arrayItem){
var match = false;
for(var key in arrayItem) {
if(! arrayItem.hasOwnProperty(key) || key === '$$hashKey')
continue;
if(arrayItem[key].toLowerCase() === searchText.toLowerCase()) {
match = true;
break;
}
}
return match;
});
};
return customFilter;
}])
它的用法如下:
<p ng-repeat="person in people | customFilter : searchText">{{person.name}} from {{person.location}}</p>
请注意,此语法不是expression : comparator。相反,它是customFilter : filterArgument。
演示:https://plnkr.co/edit/wWT3cjfy7867WUSqqSKj?p=preview