0

我正在研究网格的过滤解决方案。过滤器在面板中包含多个复选框。我目前有一个使用 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'};

我不确定这是否可能。我已经寻找它的语法,但我还没有找到它。我知道有一些方法可以将它放入控制器中,但是由于我们当前的项目,这个实现会容易得多。

4

2 回答 2

3

假设您使用的是 1.0.x 分支,则用于过滤对象的源代码的相关部分显示在下面的脚注中。这表明标准过滤器找到了要测试的键,然后var text = (''+expression[key]).toLowerCase();在调用之前从您的搜索条件中获取searchsearch然后使用 ( indexOf(text) > -1.

因此,您不能将搜索条件中的一项设置为需要以您尝试的方式进行评估的表达式。

您唯一的其他选择是:

  1. 使用谓词函数作为过滤器的参数(这只需要返回真/假);或者
  2. 编写自己的过滤器(这只需要从原始数组返回一个新数组)。

谓词函数

$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">

脚注:

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;
于 2013-08-31T21:05:44.233 回答
0

是的,您可以使用自定义过滤器来实现这一点,是您问题的答案。

和这里的小提琴链接

filterMultiple
于 2014-01-16T18:26:56.183 回答