角度过滤器:{v:0}不过滤任何东西。其他值正常工作

时间:2017-04-12 22:46:33

标签: javascript angularjs select filter ng-options

出于某种原因,这根本不会过滤任何东西。

以下是选择:

<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

1 个答案:

答案 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   两个值都应该被认为是相等的。

     

truefunction(actual, expected) { return angular.equals(actual, expected)}的简写。这基本上是严格的   预期和实际的比较。

     

false:一个寻找子字符串的函数的简写   以不区分大小写的方式匹配。原始值转换为   字符串。除非它们具有,否则不会将对象与基元进行比较   自定义toString方法(例如Date对象)。

     

默认为false