使用关联数组过滤ng-repeat

时间:2014-11-25 23:16:09

标签: angularjs

所以我有一个关联数组(或更精确的对象)

$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。

2 个答案:

答案 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>