使用AngularJS中的单个输入过滤多个字段

Kul*_*ary 6 angularjs angularjs-filter

我有一个JSON对象,如下所示

[{
    "id": 1,
    "firstName": "Jennifer",
    "middleName": null,
    "lastName": "Aniston",
    "address": "New York City",
}, {
    "id": 2,
    "firstName": "Angelina",
    "middleName": null,
    "lastName": "Jolie",
    "address": "Beverley Hills",
}, {
    "id": 3,
    "firstName": "Emma",
    "middleName": null,
    "lastName": "Watson",
    "address": "London",
}]
Run Code Online (Sandbox Code Playgroud)

我正在使用ng-repeat在视图中填充这些数据.

<td ng-repeat="row in list | filter:filterBeauties">
{{row.firstName}} {{row.lastName}}
</td>
Run Code Online (Sandbox Code Playgroud)

现在我有一个输入框,我想用它来过滤这些名称.我想使用相同的输入框来过滤firstName然后过滤lastName而不过滤其他任何东西(例如地址).

<input type="text" placeholder="Filter" ng-model="filterBeauties.firstName">
Run Code Online (Sandbox Code Playgroud)

任何想法我怎样才能实现它?

Tre*_*vor 6

试试这个小提琴.

本质上,我创建了一个子结构,用于在显示的数据结构中进行过滤,并仅对该属性进行过滤(例如'filterTerms'):

HTML:

<div ng-controller="MyCtrl">
   <input type="text" ng-model="search.filterTerms">
   <table border="1">
      <tr ng-repeat="row in list | filter:search">
         <td>{{row.firstName}} {{row.lastName}}</td>
      </tr>
   </table>
</div>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
$scope.list = [{
    "id": 1,
    "address": "New York City",
    "firstName": "Jennifer",
    "middleName": null,
    "lastName": "Aniston",
    "filterTerms": {
        "firstName": "Jennifer",
        "middleName": null,
        "lastName": "Aniston",
    }
}, {
    "id": 1,
    "address": "New York City",
    "firstName": "Jennifer",
    "middleName": null,
    "lastName": "Leela",
    "filterTerms": {
        "firstName": "Jennifer",
        "middleName": null,
        "lastName": "Leela",            
    }
}, {
    "id": 2,
    "address": "Beverley Hills",
    "firstName": "Angelina",
    "middleName": null,
    "lastName": "Jolie",
    "filterTerms": {
        "firstName": "Angelina",
        "middleName": null,
        "lastName": "Jolie",            
    }
}, {
    "id": 3,
    "address": "London",
    "firstName": "Emma",
    "middleName": null,
    "lastName": "Watson",
    "filterTerms": {
        "firstName": "Emma",
        "middleName": null,
        "lastName": "Watson",            
    }
}];
}
Run Code Online (Sandbox Code Playgroud)

您可以通过将所有名称放在一个字段中来进一步简化此操作(请参阅此处的小提示:

HTML:

<div ng-controller="MyCtrl">
    <input type="text" ng-model="search.filterTerm" />
    <table border="1">
        <tr ng-repeat="row in list | filter:search">
            <td>{{row.first}} {{row.last}} {{row.address}}</td>
        </tr>
    </table>
</div>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

var myApp = angular.module('myApp', []);
function MyCtrl($scope) {
    $scope.list = [{
        "id": 0, "first": "Jenny", "last": "Sorenson", "address": "123 W. Wallnut St.",
        "filterTerm": "Jenny Sorenson"
    },{
        "id": 0, "first": "Susan", "last": "Hinkle", "address": "456 W. Doorbell Dr.",
        "filterTerm": "Susan Hinkle"
    },{
        "id": 0, "first": "Rachel", "last": "Karlyle", "address": "789 W. Sunset Blvd.",
        "filterTerm": "Rachel Karlyle"
    },{
        "id": 0, "first": "Gwen", "last": "Lippi", "address": "0 W. Silly Cir.",
        "filterTerm": "Gwen Lippi"
    }]
}
Run Code Online (Sandbox Code Playgroud)


jlo*_*zel 6

考虑到您的用户拥有此表单:

{
  "id": 2,
  "firstName": "Angelina",
  "middleName": null,
  "lastName": "Jolie",
  "address": "Beverley Hills"
}
Run Code Online (Sandbox Code Playgroud)

如果你想用你的名字,姓氏或两者同时搜索你的一个用户,你需要将它们连在一起.

$scope.query = '';

$scope.search = function (user) {
  var query = $scope.query.toLowerCase(),
  fullname = user.firstName.toLowerCase() + ' ' + user.lastName.toLowerCase();

  if (fullname.indexOf(query) != -1) {
    return true;
  }
  return false;
};
Run Code Online (Sandbox Code Playgroud)

true如果当前用户满足您的查询,false则此函数将返回.在函数内部,我建议将您的查询放在小写中,这样您就不必处理用户将在搜索输入中输入的大写字母.

这是HTML:

<input type="text" placeholder="Search" ng-model="query">
<table>
   <tr ng-repeat="user in users | filter:search">
      <td>{{user.firstName}} {{user.lastName}}</td>
   </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

只有当您尝试搜索Angelina Jolie,甚至(毕竟为什么不是)时Angelina,此技术才有效.如果您尝试首先搜索姓氏,它将无法正常工作.您可以通过在函数中创建第二个全名来轻松修复它(例如a ),首先在lastName中连接,然后在firstName中连接,并像第一个全名字符串一样测试它.JolieInA JOLIeJolie AngelinareverseFullname


Kul*_*ary 4

好吧,这就是我为解决这个问题所做的。

我在 json 对象中添加了一个新项目(使用angular.forEach函数)并通过它进行过滤。

$scope.list = beauties.query(function(response) {
    angular.forEach(response, function(value, key) {
          var fullName = value.firstName + ' ' + value.lastName;
          $scope.list[key].fullName = fullName;
   });
});
Run Code Online (Sandbox Code Playgroud)

输入框代码:

<input type="text" placeholder="Filter" ng-model="filterBeauties.fullName">
Run Code Online (Sandbox Code Playgroud)

NG-重复

<td ng-repeat="row in list | filter:filterBeauties">
{{row.firstName}} {{row.lastName}}
</td>
Run Code Online (Sandbox Code Playgroud)