2017-01-23 7 views
0

Я использую фильтр в ng-repeat, чтобы отделить список Jsons в двух под-списках: один с элементами, находящимися в прошлом, и другие с будущими элементами. У json есть ключ под названием «dateFrom», который я сравниваю с фактической датой, чтобы определить, в каком списке этот элемент появится.ng-repeat filter - Не фильтровать правильно?

Но, несмотря на то, что функция фильтра использует только клавишу «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

Привет человек, спасибо за ответ! В моем фактическом проекте у меня есть аналогичная проблема, когда некоторые элементы не отображаются ни в одном из двух списков. Json очень похож, но я пока не могу его воспроизвести. Есть ли способ передать только фильтр «item.dateFrom», чтобы он полностью игнорировал все остальные атрибуты? Благодаря! – TRDrake

 Смежные вопросы

  • Нет связанных вопросов^_^