При повторении списка с помощью ng-repeat
, как я могу добавить условие/фильтр по свойству этих элементов.
Пример (конечно, в реальном мире есть несколько предметов):
{"items":[{"type":"xxx"}]}
Я хочу показать только те элементы, где type!='test'
.
Следующие просто ничего не печатают:
<ul ng-repeat="item in items | filter: (item.type != 'test')">
Если я удаляю фильтр, все предметы будут напечатаны, конечно.
Кроме того, если это возможно, как я могу создать условие, которое проверяет, не допустимы ли значения нескольких type
?
Простой, используйте функцию в выражении фильтра.
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"}
)
Вы можете изменить свой 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'] ">
filter: {type: ['test', 'xxx']}
но это не работает.