2017-01-23 12 views
0

私は、ng-repeatのフィルタを使って、2つのサブリスト(現在の過去のアイテムを持つものと将来のアイテムを持つもの)のリストを分離しています。 jsonには「dateFrom」というキーがあります。これを実際の日付と比較して、このアイテムがどのリストに表示されるかを判断します。ng-repeatフィルタ - 正しくフィルタリングしていませんか?

しかし、フィルター機能はこれを決定するためにのみ「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"を変更するとフィルタにも影響します。

誰でも私にその理由を教えていただけますか?

ありがとうございます!

答えて

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); 
} 

これを2番目のサブリストのフィルタとして使用します。

<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

関連する問題