【问题标题】:AngularJs How to filter ngRepeat with another array elementsAngularJs如何用另一个数组元素过滤ngRepeat
【发布时间】:2015-12-14 18:39:57
【问题描述】:

是否有任何选项可以从 $scope.items 中过滤,其中 ID 存在于数组 $scope.myitems 中?

ng-repeat="item in items | filter:{item.id == myitems}

演示:http://codepen.io/anon/pen/rOeGYB

angular.module('myapp', [])
  .controller("mycontroller", function($scope) {
    $scope.items = [
      {
        "id": 1,
        "name": "Melodie"
      }, {
        "id": 2,
        "name": "Chastity"
      }, {
        "id": 3,
        "name": "Jescie"
      }, {
        "id": 4,
        "name": "Hamish"
      }, {
        "id": 5,
        "name": "Germaine"
      }, {
        "id": 6,
        "name": "Josephine"
      }, {
        "id": 7,
        "name": "Gail"
      }, {
        "id": 8,
        "name": "Thane"
      }, {
        "id": 9,
        "name": "Adrienne"
      }, {
        "id": 10,
        "name": "Geoffrey"
      }, {
        "id": 11,
        "name": "Yeo"
      }, {
        "id": 12,
        "name": "Merrill"
      }, {
        "id": 13,
        "name": "Hoyt"
      }, {
        "id": 14,
        "name": "Anjolie"
      }, {
        "id": 15,
        "name": "Maxine"
      }, {
        "id": 16,
        "name": "Vance"
      }, {
        "id": 17,
        "name": "Ashely"
      }, {
        "id": 18,
        "name": "Dominic"
      }, {
        "id": 19,
        "name": "Cora"
      }, {
        "id": 20,
        "name": "Bo"
      }
    ];
    $scope.myitems = ['0', '3', '6', '10', '19']
  });
<link href="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.14/angular.min.js"></link>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myapp" ng-controller="mycontroller" class="container">
  <h4>My items</h4>
  <ul class="list-group">
    <li class="list-group-item" ng-repeat="item in items | filter:{}">{{item.name}}</li>
  </ul>
  <h4>Total items</h4>
  <ul class="list-group">
    <li class="list-group-item" ng-repeat="item in items">{{item.name}}</li>
  </ul>
</div>

【问题讨论】:

标签: javascript angularjs angularjs-ng-repeat ng-repeat angularjs-filter


【解决方案1】:

Kashif Mustafa 给出的上述示例非常有效。 我们唯一要做的改变是,将 id 解析为字符串中的整数。

cshtml:

    <div ng-repeat="e in AllEntities | customArray:SelectedEntities:'id'">{{ e.label }}</div>

控制器:

     var eIds = detail.entityIds;
     var eArray = eIds.split(",");

     if (eArray.length > 0) {
         $scope.showEntities = true;
         $scope.showNone = false;
         for (var i = 0; i < eArray.length; i++) {
            $scope.SelectedEntities.push(parseInt(eArray[i]));
           }
     }

过滤器:

(your controller).filter('customArray', function ($filter) {
    return function (list, arrayFilter, element) {
        if (arrayFilter) {
            return $filter("filter")(list, function (listItem) {
                return arrayFilter.indexOf(listItem[element]) != -1;
            });
        }
    };
});

【讨论】:

    【解决方案2】:

    您的问题是您试图在您正在迭代的对象的子属性上获得匹配。

    来自文档:

    请注意,命名属性将匹配同一级别的属性 仅,而特殊的 $ 属性将匹配相同的属性 水平或更深。例如。一个数组项,例如 {name: {first: 'John', last: 'Doe'}} 不会被 {name: 'John'} 匹配,但会被匹配 {$: '约翰'}。

    我建议您制作自定义过滤器。 我已经通过实现自定义过滤器、您的要求的工作副本来更改您的代码。

    <li class="list-group-item" ng-repeat='item in items | customArray:myitems:"id"'>{{item.name}}</li>
    

    在此处查看完整的 plunker https://codepen.io/anon/pen/PPNJLB

    【讨论】:

      【解决方案3】:

      从这个答案中使用这个优秀的过滤器:

      https://stackoverflow.com/a/21171880/2419919

      .filter('inArray', function($filter){
          return function(list, arrayFilter, element){
              if(arrayFilter){
                  return $filter("filter")(list, function(listItem){
                      return arrayFilter.indexOf(listItem[element]) != -1;
                  });
              }
          };
      });
      

      【讨论】:

        【解决方案4】:
        angular.forEach($scope.items, function (v, k) { 
           console.log($scope.myitems[v.id - 1]);
           $scope.myitems[v.id- 1].name = v.name;
        }, $scope.myitems);
        

        只是为了一些提示。希望有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-26
          • 1970-01-01
          • 2017-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多