我在 ng-repeat 中使用过滤器将 Json 列表分为两个子列表:一个包含当前过去的项目,另一个包含 future 的项目。 json 有一个名为“dateFrom”的键,我将其与实际日期进行比较,以确定该项目将出现在哪个列表中。
但是,尽管过滤器函数仅使用“dateFrom”键来确定这一点,但如果我也修改其他一些键,过滤器就会发生变化。
我做了一个快速的 jsFiddle 来显示问题:
https://jsfiddle.net/1j2p2hbg/1/
过滤函数为:
$scope.isPast = function(item)
{
var now = new Date();
return (item.dateFrom <= now);
}
我们有 4 个元素...其中 3 个有实际日期,其他有 future 日期。 “isPast”函数仅检查“dateFrom”属性,但如果我更改属性“keyBoolOne”和“keyBoolTwo”,它也会影响过滤器。
谁能告诉我为什么?
提前致谢!
最佳答案
在 AngularJS 中反转过滤器的极性是有问题的。文档中也没有提及,但您应该使用
<div ng-repeat="item in list | filter: '!'+keyBoolOne">
而不是
<div ng-repeat="item in list | filter: !keyBoolOne">
但就您而言,这仍然不起作用,因为您使用的是函数而不是对象的属性。
替代方案 1
为了避免这种不明确的错误,您可以定义二级过滤函数,如下所示;
$scope.isFuture = function(item){
return !$scope.isPast(item);
}
并将其用作第二个子列表的过滤器。
<div ng-repeat="item in list | filter: isFuture">
替代方案 2
如果您不想为每个过滤器定义额外的函数(可能会被否定),您可以自己定义“not”函数。
$scope.not = function(filterFunc) {
return function (item) {
return !filterFunc(item);
}
};
并按如下方式使用它(在任何地方/任何子列表中);
<div ng-repeat="item in list | filter: not(isPast)">
要检查的引用文献;
关于javascript - ng-repeat 过滤器 - 没有过滤对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41808945/