AngularJS вложенный фильтр ng-repeat несколько параметров
Долгое время скрывался, впервые постер. Очень нравится сообщество, которое у вас есть здесь:)
Хорошо, прямо к проблеме. Целью является фильтрация ng-repeat, передавая 2 аргумента фильтру.
У меня есть вложенный ng-повтор, и при втором повторении мне нужно отфильтровать записи в зависимости от того, в каком периоде жизни они находятся в текущем месяце или нет.
Я делал это раньше с помощью ng-if, но так как я использую разные CSS для нечетных и четных строк, это привело к нежелательным результатам.
соответствующая часть HTML:
<div class="col-md-12" ng-repeat="month in monthTable">
<div class="col-md-12">
<h2>
<span>{{ month.start | amDateFormat:"MMMM" | uppercase}}</span>
</h2>
</div>
<div class="col-md-12">
<div ng-class-even="'calendar_row_even'" ng-class-odd="'calendar_row_odd'"
ng-repeat="bed in syncData.beds | filter: filterListItems(month, bed) |
orderBy:'timeFrom'">
// --> displays the unfiltered results for each month at the moment...
</div>
</div>
</div>
MonthTable используется для определения начальной и конечной точек месяца + для генерации имен в соответствующей локали, он заполняется так:
for ( var i = 0; i < 12; i++) {
$scope.monthTable.push({
start: new Date(Date.UTC($scope.currentYear, i, 1)).getTime(),
end: new Date(Date.UTC($scope.currentYear, i+1, 1)).getTime()
})
};
Довольно понятно, пока.
Теперь вот функция, которая "должна делать" фильтрацию:
$scope.filterListItems = function (month, bed) {
console.log(month);
console.log(bed);
return true;
/*return (bed.timeFrom < month.end && bed.timeUntil >= month.start);
--> this should be the code.*/
};
Проблема в том, что я не могу получить фильтр для получения 2 аргументов. Если я напишу это так:
"filter: filterListItems(month, bed)"
месяц проходит, но кровать не определена
Если я напишу это так:
"filter: filterListItems:month:bed"
передается только кровать, но месяц не определен
Я понятия не имею, что я делаю неправильно, буду очень признателен, если кто-нибудь может указать мне правильное направление.
1 ответ
Вы должны объявить свой метод как фильтр:
angular.module('yourApp')
.filter('filterListItems', filterListItems);
И адаптируйте свой метод следующим образом:
function filterListItems() {
return function(items, month) {
// 'items' represent the objects listed by your ng-repeat
// Now, filter the items to return only items that respect your condition.
return items.filter(function(item) {
return (item.timeFrom < month.end && item.timeUntil >= month.start);
});
}
}
И используйте это как:
ng-repeat="bed in syncData.beds | filterListItems:month