如何在AngularJs中使用ng-repeat过滤(键,值)?

Vur*_*ral 112 javascript frameworks angularjs ng-repeat angular-filters

我想做的事情如下:

<div ng-controller="TestCtrl">
    <div ng-repeat="(k,v) in items | filter:hasSecurityId">
        {{k}} {{v.pos}}
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

AngularJs部分:

function TestCtrl($scope) 
{
    $scope.items = {
                     'A2F0C7':{'secId':'12345', 'pos':'a20'},
                     'C8B3D1':{'pos':'b10'}
                   };

    $scope.hasSecurityId = function(k,v)
    {
       return v.hasOwnProperty('secId');
    }
}
Run Code Online (Sandbox Code Playgroud)

但不知何故,它向我展示了所有项目.如何过滤(键,值)?

bml*_*ite 129

角度过滤器只能应用于数组而不是对象,来自angular的API -

"从数组中选择项目的子集,并将其作为新数组返回."

这里有两个选项:
1)移动$scope.items到数组或 -
2)预过滤ng-repeat项目,如下所示:

<div ng-repeat="(k,v) in filterSecId(items)">
    {{k}} {{v.pos}}
</div>
Run Code Online (Sandbox Code Playgroud)

在控制器上:

$scope.filterSecId = function(items) {
    var result = {};
    angular.forEach(items, function(value, key) {
        if (!value.hasOwnProperty('secId')) {
            result[key] = value;
        }
    });
    return result;
}
Run Code Online (Sandbox Code Playgroud)

jsfiddle:http://jsfiddle.net/bmleite/WA2BE/

  • 为什么不在重复元素上添加ng-if? (11认同)
  • 人们需要小心这种方法来避免无限(摘要)循环.见[6054](https://github.com/angular/angular.js/issues/6054)和[705](https://github.com/angular/angular.js/issues/705).摘要[Narretz](https://github.com/Narretz):_简而言之,使用函数返回ng-repeat中的集合是一种反模式.最好将集合分配给范围属性,然后循环遍历._ (9认同)
  • @kentcdodds不发布不免费的链接! (8认同)
  • 有用的评论.这让我陷入了困境; 我希望能够过滤*any*iterable.非常感谢.:) (3认同)
  • 注意:这是一个perf反模式.Angular 1.3现在有无状态过滤器(https://egghead.io/lessons/angularjs-new-in-angular-1-3-stateless-filters),所以你肯定想为此创建一个过滤器. (3认同)

Val*_*nov 45

我的解决方案是创建自定义过滤器并使用它:

app.filter('with', function() {
  return function(items, field) {
        var result = {};
        angular.forEach(items, function(value, key) {
            if (!value.hasOwnProperty(field)) {
                result[key] = value;
            }
        });
        return result;
    };
});
Run Code Online (Sandbox Code Playgroud)

并在HTML中:

 <div ng-repeat="(k,v) in items | with:'secId'">
        {{k}} {{v.pos}}
 </div>
Run Code Online (Sandbox Code Playgroud)


Den*_*din 27

你也可以使用ng-repeat具有ng-if:

<div ng-repeat="(key, value) in order" ng-if="value > 0">
Run Code Online (Sandbox Code Playgroud)

  • 聪明.这节省了很多时间. (2认同)

Ren*_*aud 21

或者只是使用

ng-show="v.hasOwnProperty('secId')"
Run Code Online (Sandbox Code Playgroud)

请在此处查看更新的解

http://jsfiddle.net/RFontana/WA2BE/93/


a8m*_*a8m 11

您可以简单地使用angular.filter模块,然后您甚至可以通过嵌套属性进行过滤.
看:jsbin
2例子:

JS:

angular.module('app', ['angular.filter'])
  .controller('MainCtrl', function($scope) {
  //your example data
  $scope.items = { 
    'A2F0C7':{ secId:'12345', pos:'a20' },
    'C8B3D1':{ pos:'b10' }
  };
  //more advantage example
  $scope.nestedItems = { 
    'A2F0C7':{
      details: { secId:'12345', pos:'a20' }
    },
    'C8B3D1':{
      details: { pos:'a20' }
    },
    'F5B3R1': { secId:'12345', pos:'a20' }
  };
});
Run Code Online (Sandbox Code Playgroud)

HTML:

  <b>Example1:</b>
  <p ng-repeat="item in items | toArray: true | pick: 'secId'">
    {{ item.$key }}, {{ item }}
  </p>

  <b>Example2:</b>
  <p ng-repeat="item in nestedItems | toArray: true | pick: 'secId || details.secId' ">
    {{ item.$key }}, {{ item }}
  </p> 
Run Code Online (Sandbox Code Playgroud)

  • 您应该披露`angular.filter`不是核心角度模块,您就是它的作者. (21认同)

小智 6

这有点晚了,但我找了类似的过滤器,结束了这样的事情:

<div ng-controller="TestCtrl">
 <div ng-repeat="(k,v) in items | filter:{secId: '!!'}">
   {{k}} {{v.pos}}
 </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 您是如何使它工作的?当我将过滤器与ng重复对象一起使用时,会出现错误,这是基于Angular文档所期望的。 (2认同)