首先,我创建自定义比较器的原因是,表达式上的一个数组属性(如"tags")要求表达式具有特定顺序的值,否则将不匹配。(因此,带有标记[‘a’,‘b’]的表达式将匹配[‘x’,‘a’、‘b’、‘y’],但不匹配[‘x’、‘b’、‘a’和‘y’’]。)
我之所以能够绕过这一点,是因为在Angular的$filter服务中,它允许您提供自定义比较器。但是,我只能根据属性类型进行筛选,而不能根据键的值进行筛选。
我只想要一个对象中一个属性的自定义比较器。有没有一种方法可以在不复制和修改Angular的源代码的情况下做到这一点?
以下是我的自定义比较器示例:(位于http://plnkr.co/edit/eFeinQhHTIZrzXBm4srq)
$scope.inclusiveFilter = function(expected, actual){
if(expected && actual){
console.log(expected, actual);
if(angular.isArray(expected) && angular.isArray(actual)){
for(var t in actual){
if(expected.indexOf(actual[t]) == -1){
return false;
}
}
}
return true;
}
}
在我的例子中,标签上的过滤器工作得很好,但它不再适用于$。为了匹配任何属性,我只能根据属性的类型而不是名称来比较属性。因此,像这样的表达式永远不会起作用:
{
includeThese: ['a', 'b'],
excludeThese: ['x', 'y']
}
我不能完全理解你的要求。我为您制作了一个带有两个自定义过滤函数的plunkr,一个在列表项中按顺序查找"a"one_answers"b",另一个只在该项的标签中查找"a"one_answers"b"。希望你能接受这个并修改它以做你想做的事。我认为出于您的目的,自定义过滤器函数将比自定义比较器更容易处理。
http://plnkr.co/edit/fJ9iPQYyhGxAt00xi0OY