2017-01-23 62 views
0

我在ng-repeat中使用了一个过滤器,将两个子列表中的Jsons列表分开:一个包含Present-past项目,另一个包含未来项目。 JSON有一个名为“dateFrom”的键,我将它与实际日期进行比较以确定此项目将出现在哪个列表中。ng-repeat过滤器 - 不过滤?

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

我做了一个快速的jsfiddle,借以说明问题:有

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

我们有4个元素... 3:

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

过滤功能是他们有实际的日期和其他有未来的日期。 “isPast”函数只检查“dateFrom”属性,但如果我更改属性“keyBoolOne”和“keyBoolTwo”,它也会影响过滤器。

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

在此先感谢!

回答

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

+0

人您好,感谢回答!在我的实际项目中,我有一个类似的问题,其中一些项目没有出现在任何2个列表中。 JSON是相同的,但我不能复制它。有没有办法只将“item.dateFrom”传递给过滤器,因此它会完全忽略所有其他属性?谢谢! – TRDrake

相关问题