过滤器ng-repeat
只会考虑对象中的内容。不是循环运行时可能显示的内容。但是,您可以填充friends
真实数据,然后过滤器应该可以工作。
用法:
<ul>
<li ng-repeat="friend in friends | injectItemTitles:'itemTitles' | filter:personFilter">
<span>{{friend.name}}</span>
<span>{{friend.phone}}</span>
<span>{{friend.itemTitles.join(', ')}}</span>
</li>
</ul>
演示:http: //jsbin.com/iciyoq/2/
这种方法可能存在一个问题,因为它会在每个摘要循环中注入项目标题。因此,在大型数据集上应用控制器中的 -filter 可能会更好。injectItemTitles
完整代码:
(function (app, ng) {
'use strict';
app.controller('MainCtrl', ['$scope', function($scope) {
$scope.friends = [{
name: 'John',
phone: '555-1276',
items : ['id0', 'id1']
}, {
name: 'Mary',
phone: '800-BIG-MARY',
items : ['id1', 'id2']
}, {
name: 'Mike',
phone: '555-4321',
items : ['id2', 'id3']
}, {
name: 'Adam',
phone: '555-5678',
items : ['id3', 'id4']
}, {
name: 'Julie',
phone: '555-8765',
items : ['id4', 'id5']
}];
}]);
app.filter('injectItemTitles', ['AllItems', 'getItemTitlesFilter', function(AllItems, getItemTitlesFilter) {
return function(friends, prop){
return friends.map(function(friend) {
friend[prop] = getItemTitlesFilter(friend.items);
return friend;
});
};
}]);
app.filter('getItemTitles', ['AllItems', function(AllItems){
return function(items){
return items.map(function (id) {
return AllItems[id];
});
};
}]);
app.service('AllItems', function(){
return {
'id0' : 'aaa',
'id1' : 'aab',
'id2' : 'aba',
'id3' : 'abb',
'id4' : 'baa',
'id5' : 'bab',
'id6' : 'bba',
'id7' : 'bbb'
};
});
}(angular.module('app', []), angular));