Angularjs фильтры с операцией ИЛИ - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть такой массив данных:

$scope.data = [{
  name: 'joseph',
  statarray: [{
    status: 'Online',
    status: 'Offline',
  }],
  active: 'yes'
},
{
  name: 'arnold',
  statarray: [{
    status: 'Offline'
  }],
  active: 'no'
},
{
  name: 'john',
  statarray: [{
    status: 'Online'
  }],
  active: 'yes'
}

];

    $scope.findObjectByKey = function(array, key, value) {
        for (var i = 0; i < array.length; i++) {
            if (array[i][key] === value) {
                return array[i];
            }
        }
        return null;
    };
    $scope.Online =  function(array){
      var obj = $scope.findObjectByKey(array, 'status', 'Online');
      return obj;
    }
    $scope.Offline =  function(array){
      var obj = $scope.findObjectByKey(array, 'status', 'Offline');
      return obj;
    }

Функции $ scope.Online и $ scope.Offline сортируют данные в соответствии со статусом Online иНе в сети.

Вот мое мнение:

У меня есть два флажка в качестве фильтров:

<input ng-true-value='Online' ng-false-value='' type="checkbox" ng-model="online" type="checkbox">Online
 <input ng-true-value='Offline' ng-false-value='' type="checkbox" ng-model="offline" type="checkbox">Offline

<div ng-repeat="user in data|filter:online|filter:offline">
<p>{{user.name}}</p>
</div>

В настоящее время, когда я нажимаю флажок, соответствующий Online, отображается пользовательjoseph и john, чей статус Online, и когда я нажимаю флажок, соответствующий Offline, отображаются пользователи joseph и arnold, чей статус Offline.Это очень хорошо работает.Но когда я нажимаю обе кнопки фильтра, отображается только joseph, так как joseph имеет статус Online и Offline.Таким образом, операция AND применяется здесь.Но я хочу операцию OR здесь.Поэтому, когда я нажимаю обе кнопки фильтра, я получаю вывод как joseph, arnold и john в представлении.Любая подсказка о том, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

@ pravin navle - Вы уверены, что он работает так же, как вы описали ниже код?Потому что, когда я пытался реплицировать ту же функциональность, она работала только для автономного режима, но не для онлайн, а также для обоих проверенных.

0 голосов
/ 26 ноября 2018

Во-первых, ваш statarray кажется неправильным, учитывая, что вы объявили один объект с двумя свойствами с одинаковым именем, во-первых, мы должны переместить его в нечто вроде массива, содержащего только строки состояния ex.['Online', 'Offline'].

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

filter = {
  online: true,
  offline: false
}

и выполнить итерацию для отображения ваших данных

$scope.filterArray = function(array, key, value) {
    var filtered = [];
    for (var i = 0; i < array.length; i++) {
        var shouldInclude = false;
        shouldInclude |= ($scope.filter.online && array[i].statarray.indexOf('Online') >= 0);
        shouldInclude |= ($scope.filter.offline && array[i].statarray.indexOf('Offline') >= 0);

        if (shouldInclude) {
            filtered.push(array[i]);
        }
    }
    return filtered;
};

Это простоодин из возможных подходов, если вы можете использовать функции ES6, это станет еще проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...