javascript - ng-repeat 过滤器 - 没有过滤对吗?

标签 javascript angularjs json angularjs-ng-repeat

我在 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)">

要检查的引用文献;

Reverse the polarity of AngularJS filters

Negation on filter

关于javascript - ng-repeat 过滤器 - 没有过滤对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41808945/

相关文章:

javascript - 单击指定的 div 时停止 onblur 事件

javascript - 返回值的函数或函数

javascript - 处理 angularjs 测试中的依赖关系

AngularJS-如何从 Controller 中的ng-repeat访问下一项

angularjs - 无法在 angularFire-seed 仓库中使用 ui 路由器

javascript - 未获取返回有效 JSON 的本地主机 API

javascript - 从另一个函数访问对象中的变量

javascript - CSS3 动画与由 jQuery 触发的 CSS3 转换冲突?

arrays - 在将 URL 记录到数组中的控制台之前检查 URL 是否存在

Jqueryeach - 索引值总是从 0 开始吗​​?