【问题标题】:Angular filter with list of items in an array具有数组中项目列表的角度过滤器
【发布时间】:2016-09-12 09:56:42
【问题描述】:

我有一组具有用户和兴趣的对象。我想filter 基于兴趣的列表。 An user can have multiple interests and when selected interests check boxes the list should filter out based on those interests.我在 ng-repeat 上使用了基本过滤器,但它不起作用。

如果我选择“体育”,则应该显示“约翰”和“罗莎琳”。 如果我选择“电影”和“阅读”,那么应该显示所有 3 个用户。 下面是我的代码。

Plunker:https://plnkr.co/edit/A0ojO3MH8rDhFJVXlEAs?p=preview

查看:

<div ng-app="myApp" ng-controller="myController" style="padding:20px">
<input type="checkbox" ng-model="selection.reading" ng-true-value="'reading'" ng-false-value="''">reading
<input type="checkbox" ng-model="selection.sports" ng-true-value="'sports'" ng-false-value="''">sports
<input type="checkbox" ng-model="selection.movies" ng-true-value="'movies'" ng-false-value="''">movies
<br><br>
Selected Values: {{selectedValues}}
<hr>
    <div ng-repeat="d in data | filter: selectedValues">
      <h4>
      Name: {{d.user}}
      </h4>

        <h4>
      Interests: {{d.interests}}
      </h4>

      <hr>

</div>

控制器:

$scope.selection = {};
    $scope.data = [
        {
            user: "John",
            interests: ["reading","sports","movies"]
        },
           {
            user: "David",
            interests: ["movies","reading"]
        },
        {
            user: "Rosaline",
            interests: ["sports","movies"]
        }
    ];
    $scope.$watchCollection('selection', function () {
                $scope.selectedValues = [];
                angular.forEach($scope.selection, function (value, key) {
                    if (value) {
                        $scope.selectedValues.push(value);
                    }
                });
            });

【问题讨论】:

标签: javascript angularjs filter


【解决方案1】:

Here is 是此类示例中过滤对象的众多方法之一。

我建议在这种情况下摆脱使用$watch 并通过简单的ngChange 指令实现复选框功能。下面的例子。

<input type="checkbox" ng-model="selection.reading" ng-change="selectInterest('reading')">reading
<input type="checkbox" ng-model="selection.sports" ng-change="selectInterest('sports')">sports
<input type="checkbox" ng-model="selection.movies" ng-change="selectInterest('movies')">movies

$scope.selectInterest = function(interest){
  $scope.selection[interest] = !!$scope.selection[interest];
};

对于过滤数据,我建议使用$filter 或(只是为了简化示例)像控制器函数一样实现此过滤器。

$scope.filterUsers = function(user){
  return Object.keys($scope.selection).some(function (item) {
    return user.interests.indexOf(item) >= 0 && $scope.selection[item];
  });
};

您可以在上面的链接中查看并使用我的示例的整个代码。

【讨论】:

  • 谢谢@Artyom Pranovich。如果我想显示数据而不选中复选框,默认情况下并根据选择隐藏项目。
  • @SateeshKumarAlli,我说得对吗,您想要像 plnkr.co/edit/5OUyv6XT3vTdan7Amqkg?p=preview 这样的实现?它会在您第一次加载页面时显示所有数据,然后根据复选框选择过滤数据。
  • 完全正确。谢谢你。如果取消选中复选框时显示数据会很好。
  • @SateeshKumarAlli,这是你要的plnkr.co/edit/EnbY8w2fg6uBPQFGUuyk?p=preview
  • 这对我有帮助。非常感谢。 @ArtyomPranovich
【解决方案2】:

在 ng-repeat 中稍微修改你的 html

<div ng-repeat="d in data" ng-hide="selectedValues.length > 0 && !filteredData(d.interests)">
  <h4>
    Name: {{d.user}}
  </h4>

  <h4>
     Interests: {{d.interests}}
 </h4>

  <hr>

</div>

并在script.js中添加这个函数

             $scope.filteredData = function (data) {
             var found = false;
                 for (var i = 0; i < $scope.selectedValues.length; i++) {
                    if (data.indexOf($scope.selectedValues[i]) !== -1) { found = true; break; }
                 }   
              return found;
         };

现场示例: https://plnkr.co/edit/y8tqNiIU6p3x8d9zcdzL?p=preview

这行得通!谢谢

【讨论】:

  • 谢谢@KrishCdbry。此示例过滤兴趣,但我想根据兴趣过滤用户。
  • 是的!我已经编辑了答案,请看一下。它会工作
  • 您的代码运行良好,但没有提供所需的输出。假设如果我选择阅读和运动,它应该同时显示 John 和 Rosaline,但它只显示一个人。我会选择@Artyom Pranovich 的解决方案
  • 我虽然所有选定的兴趣都应该在那里,但如果其中任何一个我更新了。这只是换行。您现在可以访问 plunker
【解决方案3】:

您可以将过滤器保存在某个数组中,例如filterInterests 然后你的 HTML 可能看起来像:

<div ng-repeat="d in data">
  <div  ng-show="hasInterest(d.interests, filterInterests)">
  // Your code here
  </div>
</div>    

你的函数看起来像:

function hasInterest(data, interests){
  var result = false;
  // Iterate over interests from filter and check them all in provided data
  for(var=i, i<interests.length, i++){
   if(data.indexOf(i) != -1) result = true       
   else result = false;
  }
  return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2017-09-11
    相关资源
    最近更新 更多