ng-repeat过滤器 - 不过滤对吗?

时间:2017-01-23 14:42:44

标签: javascript angularjs json angularjs-ng-repeat

我在ng-repeat中使用过滤器来分隔两个子列表中的Jsons列表:一个包含过去的项目,另一个包含未来的项目。 json有一个名为“dateFrom”的键,我将其与实际日期进行比较,以确定该项目将出现在哪个列表中。

但是,尽管过滤器功能仅使用“dateFrom”键来确定这一点,但如果我也修改了其他一些键,则过滤器会更改。

我做了一个快速的jsFiddle以显示问题:

https://jsfiddle.net/1j2p2hbg/1/

过滤功能是:

$scope.isPast = function(item)
{
var now = new Date();
return (item.dateFrom <= now);
}

我们有4个元素......其中3个具有实际日期,而其他元素具有未来日期。 “isPast”函数仅检查“dateFrom”属性,但如果我更改属性“keyBoolOne”和“keyBoolTwo”,它也会影响过滤器。

任何人都可以告诉我为什么?

提前致谢!

1 个答案:

答案 0 :(得分:2)

在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

如果您不想为每个过滤器定义附加功能(可能会被否定),您可以自己定义“非”功能。

$scope.not = function(filterFunc) {
    return function (item) { 
        return !filterFunc(item); 
    }
};

并按如下方式使用(在任何地方/任何子列表中);

<div ng-repeat="item in list | filter: not(isPast)">

参考检查;

Reverse the polarity of AngularJS filters

Negation on filter