Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.12.2017, 03:02
Интересующийся
Отправить личное сообщение для One_Two Посмотреть профиль Найти все сообщения от One_Two
 
Регистрация: 20.11.2017
Сообщений: 10

Фильтр в 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>
Ответить с цитированием
  #2 (permalink)  
Старый 18.12.2017, 10:33
Интересующийся
Отправить личное сообщение для One_Two Посмотреть профиль Найти все сообщения от One_Two
 
Регистрация: 20.11.2017
Сообщений: 10

Получилось! Доделал
Нужно не ретурнить исход условия в свитче, а присваивать переменной (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>
Ответить с цитированием
  #3 (permalink)  
Старый 18.12.2017, 12:38
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает фильтр на JS. Как исправить? Leonel Javascript под браузер 1 13.11.2017 21:43
Как сделать фильтр ползунок jquery gevorg Javascript под браузер 8 22.12.2015 13:05
Фильтр по начальным символам Shasoft Angular.js 9 22.03.2015 09:25
ng-repeat кастомный фильтр для фильтрации обьектов (непонятное поведение) VerDiz Angular.js 10 04.08.2013 15:42
Фильтр каталога Nivans Элементы интерфейса 4 15.07.2012 15:27