Фильтр в ng-repeat
Всем привет!
Очень прошу помощи, разобраться в фильтре. Есть список пользователей, к нему хочу сделать фильтр с условиями по типу "точное вхождение", "вхождение" и "кроме". Создаю массив с объектами-пользователями и массив с условиями фильтрации, создаю инпут поле "что отсеять" и радио кнопки "как отсеять". Далее передаю каждого пользователя (ng-repeat) в функцию и проверяю в цикле массив с условиями, к какому он подходит, и возвращается true/false (показывать/не показывать). Суть в том, что условий может быть несколько по задумке, но у меня проверяется только первый объект с условиями, а дальнейшие игнорируются :( Наглядный пример ниже, пробую отфильтровать пользователей по вхождению "Козлов" - работает, потом ещё задаю фильтр "Кроме":"Козлов Виктор Петрович". На экране Козлов Виктор Петрович всё равно остается.. Весь мозг сломал уже((
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
<script>
angular.module('myApp', []);
angular.module('myApp').controller('Ctrl', function($scope) {
$scope.users = [
{
fullname: 'Козлова Виктория Павловна'
},
{
fullname: 'Козлов Виктор Петрович'
},
{
fullname: 'Афанасьев Геннадий Сергеевич'
},
{
fullname: 'Козлова Виктория Сергеевна'
}
];
$scope.advs = [];
$scope.currentAdv = {};
$scope.currentAdv.search = '';
$scope.currentAdv.queryType = '1';
$scope.addAdvSearch = function(){
$scope.currentAdv.queryType =+ $scope.currentAdv.queryType;
var copyAdv = angular.copy($scope.currentAdv);
$scope.advs.push(copyAdv);
console.log($scope.advs);
$scope.currentAdv.search = '';
$scope.currentAdv.queryType = '1';
};
$scope.advUserFilter = function(user){
if($scope.advs.length > 0){
for (var i = 0; i < $scope.advs.length; i++){
switch ($scope.advs[i].queryType) {
case 1:
return user.fullname.toLowerCase().indexOf($scope.advs[i].search.toLowerCase()) != -1;
break;
case 2:
return user.fullname === $scope.advs[i].search;
break;
case 3:
return !(user.fullname.toLowerCase().indexOf($scope.advs[i].search.toLowerCase()) != -1);
break;
default:
break;
}
}
} else {
return true;
}
}
})
</script>
</head>
<body>
<div ng-app="myApp">
<div ng-controller="Ctrl">
<button ng-click="adv = ! adv">Добавить условие</button>
<div>
<ul ng-repeat="user in users | filter:advUserFilter">
<li>{{user.fullname}}</li>
</ul>
</div>
<div ng-show="adv">
<input type="text" ng-model="currentAdv.search" ng-init="search=''">
<input type="radio" name="query" ng-model="currentAdv.queryType" value="1" default>
<label for="query">Вхождение</label>
<input type="radio" name="query" ng-model="currentAdv.queryType" value="2">
<label for="query">Точное вхождение</label>
<input type="radio" name="query" ng-model="currentAdv.queryType" value="3">
<label for="query">Кроме</label>
<button ng-click="addAdvSearch()">Добавить</button><br>
<span>Добавленные фильтры</span>
<ul ng-repeat="adv in advs">
<li>{{adv.search}}</li>
</ul>
</div>
</div>
</div>
</body>
</html>
|
Получилось! Доделал :)
Нужно не ретурнить исход условия в свитче, а присваивать переменной (flag) и сравнивать на && с последующим значением. И в конце возвращать flag; Вдруг кому пригодится, оставлю тут.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
<script>
angular.module('myApp', []);
angular.module('myApp').controller('Ctrl', function($scope) {
$scope.users = [
{
fullname: 'Козлова Виктория Павловна'
},
{
fullname: 'Козлов Виктор Петрович'
},
{
fullname: 'Афанасьев Геннадий Сергеевич'
},
{
fullname: 'Козлова Виктория Сергеевна'
}
];
$scope.advs = [];
$scope.currentAdv = {};
$scope.currentAdv.search = '';
$scope.currentAdv.queryType = '1';
$scope.addAdvSearch = function(){
$scope.currentAdv.queryType =+ $scope.currentAdv.queryType;
var copyAdv = angular.copy($scope.currentAdv);
$scope.advs.push(copyAdv);
console.log($scope.advs);
$scope.currentAdv.search = '';
$scope.currentAdv.queryType = '1';
};
$scope.advUserFilter = function(user){
if($scope.advs.length > 0){
var flag = true;
for (var i = 0; i < $scope.advs.length; i++){
switch ($scope.advs[i].queryType) {
case 1:
flag = flag && user.fullname.toLowerCase().indexOf($scope.advs[i].search.toLowerCase()) != -1;
break;
case 2:
flag = flag && user.fullname === $scope.advs[i].search;
break;
case 3:
flag = flag && !(user.fullname.toLowerCase().indexOf($scope.advs[i].search.toLowerCase()) != -1);
break;
default:
break;
}
}
return flag;
} else {
return true;
}
}
})
</script>
</head>
<body>
<div ng-app="myApp">
<div ng-controller="Ctrl">
<button ng-click="adv = ! adv">Добавить условие</button>
<div>
<ul ng-repeat="user in users | filter:advUserFilter">
<li>{{user.fullname}}</li>
</ul>
</div>
<div ng-show="adv">
<input type="text" ng-model="currentAdv.search" ng-init="search=''">
<input type="radio" name="query" ng-model="currentAdv.queryType" value="1" default>
<label for="query">Вхождение</label>
<input type="radio" name="query" ng-model="currentAdv.queryType" value="2">
<label for="query">Точное вхождение</label>
<input type="radio" name="query" ng-model="currentAdv.queryType" value="3">
<label for="query">Кроме</label>
<button ng-click="addAdvSearch()">Добавить</button><br>
<span>Добавленные фильтры</span>
<ul ng-repeat="adv in advs">
<li>{{adv.search}}</li>
</ul>
</div>
</div>
</div>
</body>
</html>
|
angular ng-repeat filter
One_Two,
вариант фильтрации
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
<script>
angular.module('myApp', []);
angular.module('myApp').controller('Ctrl', function($scope) {
$scope.users = [
{
fullname: 'Козлова Виктория Павловна'
},
{
fullname: 'Козлов Виктор Петрович'
},
{
fullname: 'Афанасьев Геннадий Сергеевич'
},
{
fullname: 'Козлова Виктория Сергеевна'
}
];
$scope.advs = [];
$scope.currentAdv = {};
$scope.currentAdv.search = "";
$scope.currentAdv.queryType = "1";
$scope.addAdvSearch = function() {
var pattern = $scope.currentAdv.search, flags = "i", except = false;
if ($scope.currentAdv.queryType == 2) {flags = "";}
if ($scope.currentAdv.queryType == 3) {except = true;}
var reg = new RegExp(pattern, flags);
$scope.advs.push({reg:reg, except:except, search:pattern});
$scope.currentAdv.search = "";
$scope.currentAdv.queryType = "1";
};
$scope.advUserFilter = function(user) {
return $scope.advs.every(function(filter) {
return filter.except ^ filter.reg.test(user.fullname);
});
};
})
</script>
</head>
<body>
<div ng-app="myApp">
<div ng-controller="Ctrl">
<button ng-click="adv = ! adv">Добавить условие</button>
<div>
<ul ng-repeat="user in users | filter:advUserFilter">
<li>{{user.fullname}}</li>
</ul>
</div>
<div ng-show="adv">
<input type="text" ng-model="currentAdv.search" ng-init="search=''">
<input type="radio" name="query" ng-model="currentAdv.queryType" value="1" default>
<label for="query">Вхождение</label>
<input type="radio" name="query" ng-model="currentAdv.queryType" value="2">
<label for="query">Точное вхождение</label>
<input type="radio" name="query" ng-model="currentAdv.queryType" value="3">
<label for="query">Кроме</label>
<button ng-click="addAdvSearch()">Добавить</button><br>
<span>Добавленные фильтры</span>
<ul ng-repeat="adv in advs">
<li>{{adv.search}}</li>
</ul>
</div>
</div>
</div>
</body>
</html>
|
| Часовой пояс GMT +3, время: 16:17. |