Javascript 按角度显示的一组复选框控制显示的项目

Javascript 按角度显示的一组复选框控制显示的项目,javascript,angularjs,Javascript,Angularjs,我有一个映射到复选框的标记列表。在同一控制器中,有一个包含这些标记的项目列表。具有选中标记的项目应可见 使用代码设置。我不知道如何通过活动(选中)标记过滤$scope.items。我尝试了两种不同的方法,但由于对角度非常陌生,我需要朝着正确的方向推动。我认为$scope.items应该观察$scope.tags,并通过每个tag的活动属性进行过滤。签出 在模块中定义自定义筛选器: angular .module('myApp', []) .filter('withActiveTags',

我有一个映射到复选框的标记列表。在同一控制器中,有一个包含这些标记的项目列表。具有选中标记的项目应可见

使用代码设置。我不知道如何通过活动(选中)标记过滤
$scope.items
。我尝试了两种不同的方法,但由于对角度非常陌生,我需要朝着正确的方向推动。我认为
$scope.items
应该观察
$scope.tags
,并通过每个tag的
活动属性进行过滤。

签出

在模块中定义自定义筛选器:

angular
  .module('myApp', [])
  .filter('withActiveTags', ActiveTagsFilter)
  .controller('TestController', TestController);

function ActiveTagsFilter() {
  return function (items, tags) {
    var filteredItems = [];
    angular.forEach(items, function (item) {
      if (/* tags contains an active tag that's in item.tags */) {
        filteredItems.push(item);
      }
    });
    return filteredItems;
  };
}

function TestController() {
  // controller stuff
}
然后在你的观点中写下这样的话:

<ul>
  <li ng-repeat="item in items | withActiveTags:tags">{{ item.name }}</li>
</ul>
  • {{{item.name}

现在,只要找出进行过滤的最佳方法,就可以了。下面是一个减去过滤的示例。我确实创建了一个“示例过滤器”,以演示过滤器是否工作。

您也可以使用常规功能,在此处实现:

视图更改:

<li ng-repeat="item in items | filter:tagSelected">
  • 控制器更改:

    $scope.tagSelected = function(item) {
      for(var i = 0, l = $scope.tags.length; i < l; i++) {
        var t = $scope.tags[i];
    
        for(var j = 0, k = item.tags.length; j < k; j++) {
          if(item.tags[j] == t.name && t.active) {
            return true;
          }
        }
      }
      return false;
    };
    
    $scope.tagSelected=函数(项){
    对于(var i=0,l=$scope.tags.length;i
    或位不同的解决方案


    谢谢我自己也对这个问题进行了一些尝试,并得出了这个解决方案。如果我再也不会在其他地方重复使用这种类型的过滤器,那么这个解决方案就足够了。谢谢。我不知道如何将实际的标记传递给自定义筛选函数(在html中)。考虑到我可能会在其他地方重复使用相同的过滤机制,我认为这个解决方案是最好的。你能更具体一点吗?链接断了吗?是否有不起作用的功能?请注意,plunker并没有解决原始问题,它只演示了如何创建可重用的自定义过滤器。感谢plunkr。这似乎与@nwayne的答案相似,同样适用。
     <li ng-repeat="item in items |  selectedTags : tags ">
    
    .filter('selectedTags', function() {
      return function(items, tags) {
    
        var filtered = [];
    
        tags.forEach(function(tag) {
    
          if (tag.active === true) {
    
    
            items.forEach(function(item) {
              {
    
                if (item.tags.indexOf(tag.name) > -1) {
    
    
                  if (filtered.indexOf(item) == -1) {
                    filtered.push(item);
                  }
    
                }
              }
            })
          }
    
        });
    
        return filtered;
    
      };
    })