【问题标题】:Filter ng-repeat using associative array [duplicate]使用关联数组过滤 ng-repeat [重复]
【发布时间】:2015-01-24 03:45:56
【问题描述】:

所以我有一个关联数组(或者更准确地说是对象)

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

【问题讨论】:

  • 所以您要求我们对一个您不会列出其内容的函数进行故障排除,以确定它为什么不返回 false?
  • 那不是问题。问题是它应该简单地返回一个空子集并且我得到整个子集。它根本不独立于其中的逻辑进行过滤。

标签: angularjs


【解决方案1】:

感谢 Andrew 的建议,这绝对是我遇到的问题。如果有人想使用它,我遇到了一个更通用的解决方案:

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>

【讨论】:

    【解决方案2】:

    这里的问题是你不再有一个对象数组,你有一个带有属性的对象,内置的过滤器进程无法遍历这些属性。您的过滤器需要手动将对象转换回数组,然后才能过滤它。这里的副作用是您将因此无法访问ng-repeat 中的id 属性。

    在任何过滤逻辑之前,您需要使用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" >
    

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 2019-06-16
      • 1970-01-01
      • 2018-01-28
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多