我在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”,它也会影响过滤器。
任何人都可以告诉我为什么?
提前致谢!
答案 0 :(得分:2)
在AngularJS中反转滤波器的极性是有问题的。文档中也没有提到它,但你应该使用
<div ng-repeat="item in list | filter: '!'+keyBoolOne">
而不是
<div ng-repeat="item in list | filter: !keyBoolOne">
但是在你的情况下,这仍然无效,因为你使用的是函数而不是对象的属性。
为了避免这种不明确的错误,您可以定义二次过滤功能,如下所示;
$scope.isFuture = function(item){
return !$scope.isPast(item);
}
并将其用作第二个子列表的过滤器。
<div ng-repeat="item in list | filter: isFuture">
如果您不想为每个过滤器定义附加功能(可能会被否定),您可以自己定义“非”功能。
$scope.not = function(filterFunc) {
return function (item) {
return !filterFunc(item);
}
};
并按如下方式使用(在任何地方/任何子列表中);
<div ng-repeat="item in list | filter: not(isPast)">
参考检查;