给定一个具有$ scope属性的控制器,该控制器是具有其他属性的对象,而不是如下所示的数组,我该如何过滤该ng-repeat集合?
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>
我将数据结构更改为数组。无论如何,这是另一个过滤好友对象的实现。
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,就可以这样调用。
name
phone
<li ng-repeat="friend in friends | friendFilter:query">
我compareStr在另一个模块中定义了,但您实际上并不需要这样做。
compareStr
angular.module('utils', []) .factory('utils', function(){ return{ compareStr: function(stra, strb){ stra = ("" + stra).toLowerCase(); strb = ("" + strb).toLowerCase(); return stra.indexOf(strb) !== -1; } }; });
不要忘记将filters模块注入您的应用程序
filters
angular.module('app',['filters'])
这是完整的示例:http : //jsbin.com/acagag/5/edit