我想了解AngularJS中的“过滤器”过滤器。从文档中理解,它还需要第二个参数。如果传递为“true”,则执行严格的比较。
HTML
<fieldset>
<legend>Array of objects (Search all properties)</legend>
<input type="text" ng-model="searchObject" />
<ul>
<li ng-repeat="value in arrOfObjects | filter: searchObject: true">
<span>{{value.firstName}}</span>
<span> {{value.lastName}}</span>:
<span><strong>{{value.email}}</strong></span>
</li>
</ul>
</fieldset>
THE JS
$scope.arrOfObjects = [
{
firstName: "Anup",
lastName: "Vasudeva",
email: "anup.vasudeva@email.com"
},
{
firstName: "Vijay",
lastName: "Kumar",
email: "vijay.kumar@email.com"
},
{
firstName: "Virat",
lastName: "Kohli",
email: "virat.kohli@yahoo.com"
}
];
我期待的是,如果我输入“aNuP”,它会尝试与所有属性完全匹配,并且无法返回任何内容。因此,我应该看到一个空列表。
我错过了什么。
答案 0 :(得分:2)
这是一个可以显示以下解释的plunker:http://plnkr.co/edit/b1vuJV4RFNQSdpfaw0Pd?p=preview
对象的角度过滤通过比较对象的字段来工作,以查看它们是否包含过滤条件而忽略大小写。这提供了广泛的用法,可以通过添加第二个布尔参数true
来缩小,以指示您要删除contains
规则。
在你的例子中:
<fieldset>
<legend>Array of objects (Search all properties)</legend>
<input type="text" ng-model="searchObject" />
<ul>
<li ng-repeat="value in arrOfObjects | filter: searchObject: true">
<span>{{value.firstName}}</span><span> {{value.lastName}}</span>: <span><strong>{{value.email}}</strong></span>
</li>
</ul>
</fieldset>
键入Vasudeva
,Anup
或anup.vasudeva@email.com
会因为单个字段的完全匹配而过滤除第一条记录以外的所有记录。因此,任何字段的完全匹配将导致显示记录。
删除'true':
<li ng-repeat="value in arrOfObjects | filter: searchObject">
提供更大的包含集,因为它在任何字段中查找表达式并忽略大小写,因此键入字母a
,它出现在一个或多个字段中的所有对象中,列出所有对象。
要过滤对象中的单个字段,请使用以下格式:
<li ng-repeat="value in arrOfObjects | filter: {lastName :searchObject}">
并且类似地,您可以添加第二个布尔参数以获得完全匹配:
<li ng-repeat="value in arrOfObjects | filter: {lastName :searchObject}:true">
最后,您可以通过在控制器中定义一个函数来创建自定义过滤器,该函数对于给定的匹配返回true或false。
<li ng-repeat="value in arrOfObjects | filter: myEmailFilter">
在你的控制器中写下实际的过滤器。
$scope.myEmailFilter = function(value) {
console.log(value.email);
if(value.email.indexOf("email.com")>=0) {
console.log('true');
return true;
} else {
console.log('false');
return false;
}
};