我可以在ng-repeat中使用过滤器来过滤特定字段的多个项目

时间:2013-08-31 17:51:26

标签: angularjs angularjs-ng-repeat

我正在研究网格的过滤解决方案。过滤器在面板中包含多个复选框。我目前有一个使用ng-repeat指令内置过滤器的工作解决方案。但是,我还没有找到一种方法来使用多个参数过滤单个字段。这就是我所拥有的:

HTML:

<tr data-ng-repeat="rule in rules | orderBy:sortOrder | filter:filterOrder">

位指示:

var defaultFilter = {critical:'', score:'', category:'', pass:'false'};
$scope.filterOrder = defaultFilter;

我希望能够做到这样的事情:

var defaultFilter = {critical:'', score:'', category:'', pass:'false && notRun'};

我不确定这是否可行。我已经找到了它的语法,但我还没有找到它。我知道有办法将它放在控制器中,但由于我们目前的项目,这个实现将会相当容易。

2 个答案:

答案 0 :(得分:3)

假设您使用的是1.0.x分支,则对象过滤的relevant part of the source code显示在下面的脚注中。这表明标准过滤器找到要测试的密钥,然后在调用var text = (''+expression[key]).toLowerCase();之前从搜索条件中获取searchsearch然后使用indexOf(text) > -1进行文字搜索。

因此,您无法将搜索条件中的某个项目设置为需要按照您尝试的方式进行评估的表达式。

您唯一的其他选择是:

  1. 使用predicate function作为过滤器的参数(这只需要返回true / false);或
  2. 编写自己的过滤器(这只需要从原来的过滤器中返回一个新的数组)。
  3. 谓词函数

    $scope.myFilterTest(item) { return ... true or false test result ...; }
    

    <tr data-ng-repeat="rule in rules | orderBy:sortOrder | filter:myFilterTest">
    

    自定义过滤器

    var someApp=angular.module('myApp', []);
    
    someApp.filter('complexFilter', function() {
      return function(input, criteria) {
        var result = [];
        for (var i = 0; i < input.length; i++) {
          if(... multiple tests ...){
            result.push(input[i]);
          }
        }
        return result;
      }
    });
    

    然后:

    <tr data-ng-repeat="rule in rules | orderBy:sortOrder | complexFilter:filterOrder">
    

    脚注:

    relevant part of src/ng/filter/filter.js

      case "object":
        for (var key in expression) {
          if (key == '$') {
            (function() {
              var text = (''+expression[key]).toLowerCase();
              if (!text) return;
              predicates.push(function(value) {
                return search(value, text);
              });
            })();
          } else {
            (function() {
              var path = key;
              var text = (''+expression[key]).toLowerCase();
              if (!text) return;
              predicates.push(function(value) {
                return search(getter(value, path), text);
              });
            })();
          }
        }
        break;
    

答案 1 :(得分:0)

是的,您可以使用自定义过滤器实现此目的,here就是您的问题的答案。

小提琴链接here

filterMultiple