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
Другие вопросы по тегам