AngularJS вложенный фильтр ng-repeat с несколькими параметрами

давний наблюдатель, первый постер. Очень нравится сообщество, которое у вас есть здесь :)

Хорошо, сразу к проблеме. Цель — отфильтровать ng-repeat, передав фильтру 2 аргумента.

У меня есть вложенный ng-repeat, и во втором повторе мне нужно отфильтровать записи в зависимости от того, продолжительность их жизни в текущем месяце или нет.

Я делал это раньше с помощью 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>

МесяцТаблица используется для определения начала и окончания месяца + для генерации имен является подходящей локалью, она заполняется следующим образом:

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"

передается только кровать, но месяц не определен

Я понятия не имею, что я делаю неправильно, был бы очень признателен, если бы кто-нибудь мог указать мне правильное направление.


person markok    schedule 11.02.2016    source источник


Ответы (1)


Вы должны объявить свой метод как filter :

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
person chalasr    schedule 11.02.2016