Как отфильтровать ng-repeat по значению свойства?

0

При повторении списка с помощью ng-repeat, как я могу добавить условие/фильтр по свойству этих элементов.

Пример (конечно, в реальном мире есть несколько предметов):

{"items":[{"type":"xxx"}]}

Я хочу показать только те элементы, где type!='test'.

Следующие просто ничего не печатают:

<ul ng-repeat="item in items | filter: (item.type != 'test')">

Если я удаляю фильтр, все предметы будут напечатаны, конечно.

Кроме того, если это возможно, как я могу создать условие, которое проверяет, не допустимы ли значения нескольких type?

Теги:

2 ответа

1
Лучший ответ

Простой, используйте функцию в выражении фильтра.

angular.module('app', [])
  .controller('AppCtrl', function($scope) {
    $scope.items = [{
      "type": "xxx"
    }, {
      "type": "test"
    }];

    $scope.filterFn = function(value) {
       return value.type !== 'test';
    };
  })
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="AppCtrl">
  <ul>
    <li ng-repeat="item in items | filter: filterFn">{{item.type}}</li>
  </ul>
</div>

Если ваша схема данных изменится, просто обновите функцию фильтра.

Вы также можете использовать объектную нотацию

angular.module('app', [])
  .controller('AppCtrl', function($scope) {
    $scope.items = [{
      "type": "xxx"
    }, {
      "type": "test"
    }];
  })
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="AppCtrl">
  <ul>
    <li ng-repeat="item in items | filter: {type: '!test'}">{{item.type}}</li>
  </ul>
</div>

но это имеет некоторые ограничения, такие как не поддержка примитивных фильтров значений (он ожидает объект со свойствами как элемент), и один и тот же фильтр не может быть указан несколько раз (что-то вроде {type:"!test!xxx"})

1

Вы можете изменить свой ng-repeat чтобы читать так:

<ul ng-repeat="item in items | filter: {type: '!test'}">

Чтобы предоставить несколько значений type вы можете создать свой собственный фильтр для повторного использования следующим образом:

app.filter('typeFilter', function(){
  return function(arr,criteria){
    if(!angular.isDefined(criteria) || criteria == ''){
      return arr;
    }

    return arr.filter(function(curr){
      return criteria.indexOf(curr.type) == -1;
    });
  }
});

а затем измените инструкцию ng-repeat образом:

//List array of criteria...
<ul ng-repeat="item in items | typeFilter:['test'] ">
  • 0
    Отлично, а как добавить несколько «ключевых слов» для проверки в фильтре?
  • 0
    Как filter: {type: ['test', 'xxx']} но это не работает.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню