出于某种原因,这根本不会过滤任何东西。
以下是选择:
<select
ng-model="s.id"
ng-options="c.v as c.name for c in oarray | filter:{v:0}"
>
</select>
这是结构:
$scope.oarray = [{ name:"(select)", v:0 },{ name:"name1", v:100 },{ name:"name2", v:200 }];
选择框会列出所有元素:"(select)"
,"name1"
和"name2"
,即使过滤器说只返回"(select)"
,因为它是唯一一个有成员v==0
{1}}。
如果我将过滤器更改为v:100
,它会正确过滤这些内容。
为什么?如果这是“特征”或“副作用”,那么在不更改预定义值的情况下,解决方法是什么?
提前谢谢。
PS:这是你的游乐场:http://plnkr.co/edit/huRPv08A4bucJmcG60Fe?p=preview
答案 0 :(得分:1)
您的过滤器正在搜索v CONTAINS 0
的值的所有对象,而不是它等于0
的位置。
您需要将:true
发送到过滤器,告诉它进行严格的比较,例如
ng-options="c.v as c.name for c in oarray | filter:{v:0}:true"
这里的第二个参数是比较器,一个默认为false
的可选参数。 Angular documentation for filter包含有关此参数的以下信息:
比较器,用于确定是否使用检索的值 表达式(当它不是函数时)应被视为匹配 基于期望值(来自过滤器表达式)和 实际值(来自数组中的对象)。
可以是以下之一:
function(actual, expected)
:函数将被赋予对象 值和要比较的谓词值,如果,则返回true 两个值都应该被认为是相等的。
true
:function(actual, expected) { return angular.equals(actual, expected)}
的简写。这基本上是严格的 预期和实际的比较。
false
:一个寻找子字符串的函数的简写 以不区分大小写的方式匹配。原始值转换为 字符串。除非它们具有,否则不会将对象与基元进行比较 自定义toString方法(例如Date对象)。默认为
false
。