过滤器的第二个参数不起作用

时间:2013-12-11 16:03:04

标签: javascript angularjs

我想了解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”,它会尝试与所有属性完全匹配,并且无法返回任何内容。因此,我应该看到一个空列表。

我错过了什么。

1 个答案:

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

键入VasudevaAnupanup.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;
    }
  };