使用OR操作的angularjs过滤器

时间:2018-11-26 07:32:33

标签: javascript angularjs angular-filters

我有这样的数据数组:

$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和Offline对数据进行排序。

这是我的观点:

我将这两个复选框用作过滤器:

<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的用户johnOnline,以及当我单击与{{1 }}显示状态为Offline的用户josepharnold。这很完美。但是,当我单击两个过滤器按钮时,它仅显示Offline,因为joseph同时具有josephOnline状态。因此,此处应用了Offline操作。但是我想在这里进行AND操作。因此,当我同时单击两个过滤器按钮时,在视图中应将输出分别为ORjosepharnold。有什么提示我该怎么做?

2 个答案:

答案 0 :(得分:0)

首先,考虑到您声明了一个具有两个具有相同名称的属性的对象,因此您的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功能,这将变得更加简单。

答案 1 :(得分:0)

@ pravin navle- 您确定它的工作方式与下面的代码所述相同吗?因为当我尝试复制相同的功能时,它仅适用于脱机,不适用于在线以及“两者都选中”。