Angular filter by array of values

I am trying to filter a list of elements using an array of values. So far, I have managed to filter multiple fields in a table, but I have not been able to filter using multiple values ​​in one column of the table. This plunker shows that this filter object is being used.

$scope.filters = {
   user:{
     name:"John"
   },
   status:{
     name: "Approved" 
   }
};

However, what I'm trying to accomplish is to create a filtered list based on this filter object:

$scope.filters = {
  user:{
    name:"John"
  },
  status:{
    name: ["Approved", "For Review"] 
  }
};

Basically, I want a list of all Johns whose status name is either "Approved" or "For Review".

Is it possible to do this using the Angular filter filter, "or is this a job for a custom filter?

+4
source share
3 answers

. :

$scope.filtered = $filter('filter')($scope.users, {user: $scope.filters.user}).filter(function(user) {
    return $scope.filters.status.name.indexOf(user.status.name) > -1;
});

: http://plnkr.co/edit/KcP6bLujFnxFPXrVRfUp?p=preview

+3

, , , . : . , : , .

, :

app.filter('byStatus', function() {
  return function(items, filter) {
    var out = [];
    //status.name
    angular.forEach(items, function(item) {
      if (filter.name.constructor != Array) {
        if (filter.name == item.status.name) {
          out.push(item);
        }
      } else if (filter.name.indexOf(item.status.name) > -1) {
        out.push(item);
      }
    });
    return out;
  };
});
app.filter('byUser', function() {
  return function(items, value) {
    var out = [];
    //user.name
    angular.forEach(items, function(item) {
      if (item.user.name.indexOf(value.name) > -1) {
        out.push(item);
      }
    });
    return out;
  };
});

Plunker: http://plnkr.co/edit/g3ERmycps8Fg6trE1NfN?p=preview

$filter, , , .

+2

Html: -

<table id="searchTextResults">
  <tr><th>Name</th><th>Phone</th><th>Status</th></tr>
  <tr ng-repeat="friend in friends | filter: myFilter">
    <td>{{friend.user.name}}</td>
    <td>{{friend.phone}}</td>
    <td>{{friend.status.name}}</td>
  </tr>
</table>

: -

$scope.myFilter = function (item) { 
    return item.status.name === 'For Review' || item.status.name === 'Approved'; 
};
+1
source

Source: https://habr.com/ru/post/1599857/


All Articles