所以我有一个关联数组(或更精确的对象)
$scope.items = { 'x': {...}, 'y': {...} };
我想做一个工作正常的ng-repeat
<div ng-repeat="(id, data) in items | filter: customFunction" >
然而,过滤器似乎不起作用,其定义为
$scope.customFunction = function (item) { return item.status === 'active'; }
然而,过滤器无法正常工作。我总是独立于过滤器而得到整套。在过滤器控制器内调用警报甚至不显示。似乎根本没有调用该函数。
在我迭代数组之前它运行良好:
$scope.items = [ {...}, {...} ];
<div ng-repeat="item in items | filter: customFunction" >
为了简单起见,我没有包含我的逻辑,我有一些过滤逻辑,而不仅仅是返回false。
答案 0 :(得分:3)
这里的问题是你不再拥有一个对象数组,你有一个具有属性的对象,内置的过滤器进程无法迭代。您的过滤器需要手动将对象转换回数组才能过滤它。这里的副作用是您将无法访问id
中的ng-repeat
属性。
在任何过滤器逻辑之前,您需要使用items
对象填充标准数组。
执行您发布的逻辑的过滤器我会这样做:
app.filter('customFunction', function(){
return function (items) {
var filtered = [];
angular.forEach(items, function(item){
if item.status === 'active';
filtered.push(item);
});
return filtered;
};
});
<div ng-repeat="item in items | customFunction" >
答案 1 :(得分:2)
感谢安德鲁的建议,这绝对是我遇到的问题。我遇到了一个更通用的解决方案,以防有人想要使用它:
app.filter('filterObject', function() {
return function(items, callback) {
var filtered = {};
angular.forEach(items, function(item, key) {
if (callback(item)) {
filtered[key] = item;
}
});
return filtered;
};
});
然后你用它作为
item in items | filterObject:<customFunction>