2017-01-23 69 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

相關問題