我正在研究网格的过滤解决方案。过滤器在面板中包含多个复选框。我目前有一个使用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'};
我不确定这是否可行。我已经找到了它的语法,但我还没有找到它。我知道有办法将它放在控制器中,但由于我们目前的项目,这个实现将会相当容易。
答案 0 :(得分:3)
假设您使用的是1.0.x分支,则对象过滤的relevant part of the source code显示在下面的脚注中。这表明标准过滤器找到要测试的密钥,然后在调用var text = (''+expression[key]).toLowerCase();
之前从搜索条件中获取search
。 search
然后使用indexOf(text) > -1
进行文字搜索。
因此,您无法将搜索条件中的某个项目设置为需要按照您尝试的方式进行评估的表达式。
您唯一的其他选择是:
$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)