Angularjs:如何应用NOT过滤器?

时间:2015-10-16 07:01:08

标签: javascript angularjs filter angular-filters

如何在以下示例中应用NOT过滤器?

尝试$filter('filter')(users,{ranks: {id: '!' + '15'},true)$filter('filter')(users, !{ranks: {id:15}},true),但似乎没有任何效果。

这里的目的是在过滤后的数组

中不让id = 15的用户

控制器:

app.controller('MainCtrl', function($scope,$filter) {

  $scope.users = [
    {
      id: 1,
      name: 'John Doe',
      ranks: [ 
        { id: 1, name: 'Admin'},
        { id: 2, name: 'Doe' }
        ],
    },
    {
      id: 2,
      name: 'Barbara Doe',
      ranks: [ { id: 15, name: 'Wife'}, { id: 2, name: 'Doe' }],
    },
    {
      id: 3,
      name: 'Jane Doe',
      ranks: [ { id: 16, name: 'Wife'}, { id: 17, name: 'Doe' }],
    },
  ];

  $scope.filter = $filter('filter')($scope.users, {ranks: {id: !15}},true);


});

HTML:

<p>HTML Filter: List of users without having a rank with id: 15</p>
    <ul>
      <li ng-repeat="user in users | filter:{ranks: {id: '!' + '15'}} : true"> 
        {{ user }}
      </li>
    </ul>

    <p>Controller Filter: List of users without having a rank with id: 15</p>
    <ul>
      <li ng-repeat="user in filter "> 
        {{ user }}
      </li>
    </ul>

Plunker: http://plnkr.co/edit/73lLDpn3uLHozObKn539?p=preview

3 个答案:

答案 0 :(得分:2)

您正在尝试过滤其排名属性包含{id:15}的用户,您可能无法选择编写自定义过滤器或谓词函数来执行此操作(因为这不是传统的==或!=比较)

以下是使用谓词函数的示例:

     ranksContainsId15 = function(user, index, users){
        // Look for rank.id === 15
        for(var i=0; i < user.ranks.length; i++){
          if(user.ranks[i].id === 15){
            return false; // so this user will NOT be included
          }
        }

        // no rank.id === 15 found, so this user will be included
        return true;
      }

      $scope.filtered = $filter('filter')($scope.users, ranksContainsId15);

我已更新示例以显示所有用户,然后显示其排名数组中没有rank.id == 15的用户

http://plnkr.co/edit/6x3OEzSiDfIziAnVQ0Em?p=preview

要使用可编程ID创建谓词函数,请使用函数创建它们

createPredicateFn = function(id){
    return function(user, index, users){
            for(var i=0; i < user.ranks.length; i++){
              if(user.ranks[i].id === id){
                return false;
              }
            }

            return true;
    }
}

$scope.filtered = $filter('filter')($scope.users, createPredicateFn(15));

答案 1 :(得分:1)

您可以创建自定义过滤器来手动过滤项目:

HAVING COUNT(*)>=TIMESTAMPDIFF(WEEK,'2015-03-01',NOW())

并像这样使用:

.filter('customFilter', function() {
  return function(array, numberToSkip) {
    var result = [];

    for (i = 0; i < array.length; i++) {
      var arrayItemContainsId = false;

      for (j = 0; j < array[i].ranks.length; j++) {
        if (array[i].ranks[j].id === numberToSkip) {
          arrayItemContainsId = true;
        }
      }

      if (arrayItemContainsId == false) {
        result.push(array[i]);
      }
    }

    return result;
  };
});

答案 2 :(得分:-1)

您已经实现了非过滤器略有错误。请改用

<li ng-repeat="user in users | filter: !{ranks: {id:15}} : true">