如何从 AngularJS ng-repeat 中排除项目

How do you exclude items from AngularJS ng-repeat

是否可以排除 ng-repeat 中的项目?

例如,我有类似以下内容(经过简化以缩短内容):

<div class="row" data-ng-repeat="entry in data.feed.entry | orderBy:'gsx$timestamp.$t':true">
{{entry.gsx$jobID.$t}}
</div>

我有另一个名为 exclusionData 的范围对象,它的结构类似。我想排除我的第一个 ng-repeat 中出现在 exclusionData.feed.entry.gsx$jobID.$t

中的任何项目

或者是否有更简单的方法可以在我的控制器中执行此操作(即立即排除数据)?数据和排除数据均来自两个不同的 JSON 提要。

最简单的方法是在重复中使用过滤器指令,但您也可以在控制器中执行此操作。

这取决于您的应用程序从 OO 设计的角度看如何。

您可以使用如下所示的过滤器,也可以只使用 ng-if/ng-show

<div class="row" data-ng-repeat="entry in data.feed.entry | orderBy:'gsx$timestamp.$t':true | filter: {gsx$exlucde.$t: true}">
{{entry.gsx$jobID.$t}}
</div>

data.feed.entry = [{
    gsx$jobID.$t: 'something',
    gsx$exlucde.$t: true,
    gsx$timestamp.$t: '1/1/1990'
}]

您可以像这样创建过滤器:

angular.module('appFilters', []).filter('yourFilterName', function() {
    return function(input, key) {          
      var myList = [];
      for(var i = 0; i < input.length; i++){
        var found = _.find($scope.exclusionData, function() { // You can replace this with your own function.
          // Your own logic here    
        });

        if(found){              
          myList.push(input[i]);
        }
      }
      return myList;
    };
  });

我假设您的项目中包含下划线,但您可以改为实现自己的搜索功能。

在您的模板中,您像这样传递过滤器:

<div class="row" data-ng-repeat="entry in data.feed.entry | yourFilterName | orderBy:'gsx$timestamp.$t':true">
  {{entry.gsx$jobID.$t}}
</div> 

这将排除匹配数据,只需添加一个 ng-if,并添加一个 bang 使其为假。

<div 
    class="row"
    data-ng-repeat="(key, entry) in data.feed.entry | orderBy:'gsx$timestamp.$t':true"
    ng-if="!exclusionData.feed[key]gsx$jobID.$t">
    {{entry.gsx$jobID.$t}}
</div>