一尘不染

在对象映射而非AngularJS中的数组上进行过滤

angularjs

给定一个具有$ scope属性的控制器,该控制器是具有其他属性的对象,而不是如下所示的数组,我该如何过滤该ng-repeat集合?

这是一个JSFiddle:http :
//jsfiddle.net/ZfGx4/110/

控制器:

function HelloCntl($scope, $filter) {
    $scope.friends = {
        john: {
            name: 'John',
            phone: '555-1276'
        },
        mary: {
            name: 'Mary',
            phone: '800-BIG-MARY'
        },
        mike: {
            name: 'Mike',
            phone: '555-4321'
        },
        adam: {
            name: 'Adam',
            phone: '555-5678'
        },
        julie: {
            name: 'Julie',
            phone: '555-8765'
        }
    };
}​

模板:

<div ng:app>
 <div ng-controller="HelloCntl">
  <input placeholder="Type to filter" ng-model="query">     
  <ul>
   <li ng-repeat="(id, friend) in friends | filter:query">
    <span>{{friend.name}} @ {{friend.phone}}</span>
   </li>
  </ul>
 </div>
</div>

阅读 228

收藏
2020-07-04

共1个答案

一尘不染

我将数据结构更改为数组。无论如何,这是另一个过滤好友对象的实现。

angular.module('filters',['utils'])
  .filter('friendFilter', function(utils){

    return function(input, query){
      if(!query) return input;
      var result = [];

      angular.forEach(input, function(friend){
        if(utils.compareStr(friend.name, query) ||
           utils.compareStr(friend.phone, query))
          result.push(friend);          
      });
      return result;
    };
  });

这样仅对对象进行一次迭代,然后按name和比较phone,就可以这样调用。

<li ng-repeat="friend in friends | friendFilter:query">

compareStr在另一个模块中定义了,但您实际上并不需要这样做。

angular.module('utils', [])
  .factory('utils', function(){
    return{
      compareStr: function(stra, strb){
        stra = ("" + stra).toLowerCase();
        strb = ("" + strb).toLowerCase();
        return stra.indexOf(strb) !== -1;
      }
    };
  });

不要忘记将filters模块注入您的应用程序

angular.module('app',['filters'])

这是完整的示例:http :
//jsbin.com/acagag/5/edit

2020-07-04