AngularJS嵌套ng-repeat过滤多个参数

时间:2016-02-11 10:01:06

标签: javascript angularjs angularjs-ng-repeat ng-repeat angularjs-filter

长时间潜伏,第一次海报。真的很喜欢你在这里拥有的社区:)

对这个问题没问题。目标是通过将2个参数传递给过滤器来过滤ng-repeat。

我有一个嵌套的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>

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 个答案:

答案 0 :(得分: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