NgRepeat过滤复杂的结构

时间:2014-03-20 18:12:15

标签: angularjs angularjs-ng-repeat

我已经获得了一个复杂的JSON对象来显示在Angular中,我想在钻入对象后将其过滤到两个列表中。

对象结构是:

{
  foo:
  {
    bar:
    {
      showA: { value: true, type: 'A' },
      showB: { value: false, type: 'A' },
      showC: { value: true, type: 'A' }
    }
  }
}

我试图获得一个" false"和"真"。

在这种情况下:

禁用:

  • showB - 输入:A

启用:

  • showA - 类型:A
  • showC - 类型:A

我无法过滤对象,也无法获得"键"对象,例如" SHOWA"

我尝试使用:

item in profile['foo']['bar'] | filter: { value: false }

访问正确的对象,但我无法过滤或获取"键"它的。

这是一个破碎的傻瓜来证明:

http://plnkr.co/edit/9NniQdo213AuEbf0pghA?p=preview

任何建议都会很棒!

1 个答案:

答案 0 :(得分:2)

查看这个工作伙伴:http://plnkr.co/edit/TdM9P592OXd6Bx81Bmbt?p=preview

它使用自定义过滤器myFilter,这使得过滤任务非常简单。 myFilter返回一个新对象,其中只有对象的值等于作为过滤器的第二个参数给出的值。

app.filter('myFilter', function() {
  return function(bar, value) {
    var r = {};
    for (var key in bar) {
      if (bar[key].value == value) {
        r[key] = bar[key];
      }
    }
    return r;
  }
});

要使用ng-repeat获取密钥,请使用以下语法:

    <li ng-repeat="(key, item) in profile['foo']['bar'] | myFilter:false">
      <input type="checkbox" ng-model="item.value" /> {{ key }}
    </li>

如果您可以更改$scope.profile的结构,使用此结构可以更轻松地过滤任务:

bar: [
    {name: 'ShowA', value: false, type: 'A'},
    ...
]