2014-03-07 51 views
1

我有一个自定义的角度过滤器,我试图使其更通用。过滤器会查看员工集合,并根据雇佣后的月数过滤列表。我试图让过滤器更通用,因此我可以在其他具有日期但具有不同属性名称的列表上使用它(例如:过去xx个月内创建的过滤器发票)。我如何传递要过滤的属性的名称,或者如何传递date属性的集合而不是整个对象?传递对象属性的数组来过滤

HTML

<html ng-app="dateFilterTest"> 
    <head> 

    </head> 
    <body ng-controller="filterController"> 
     <select ng-model="maxLookBack"> 
      <option value="6">6 Months</option> 
      <option value="12" selected="selected">1 Year</option> 
      <option value="24">2 Year</option> 
      <option value="999">All</option> 
     </select> 
     <ul> 
      <li ng-repeat="person in people | DateAgeFilter:maxLookBack">{{person.name}}</li> 
     </ul> 
    </body> 

    <script type="text/javascript" src="js/angular.min.js"></script> 
    <script type="text/javascript" src="js/controllers/dateFiltercontroller.js"></script> 
</html> 

JS

var app = angular.module('dateFilterTest', []); 

app.filter('DateAgeFilter', function(){ 
    return function(items, maxage) { 

     var minDate = new Date() 
     minDate.setMonth(minDate.getMonth() - maxage); 

     var result = []; 
     for (var i=0; i<items.length; i++) { 
      if (items[i].hireDate.getTime() > minDate.getTime()) { 
      result.push(items[i]); 
      } 
     } 

     return result; 
    }; 
}); 

app.controller('filterController', function($scope){ 
    $scope.people = [ 
     {'name': 'Person 1', 
     'hireDate': new Date('Jun 1, 2013')}, 
     {'name': 'Person 2', 
     'hireDate': new Date('Aug 1, 2012')}, 
     {'name': 'Person 3', 
     'hireDate': new Date('May 1, 2011')}, 
     {'name': 'Person 4', 
     'hireDate': new Date('Jun 1, 2012')}, 
     {'name': 'Person 5', 
     'hireDate': new Date('Mar 1, 2014')}, 
     {'name': 'Person 6', 
     'hireDate': new Date('Mar 1, 2014')}, 
    ]; 
}); 

plunker:

http://plnkr.co/edit/9zOWxJdMNg5zHz7qYf7c

回答

0

您可以通过属性名作为额外的参数,像这样的过滤器 - (使用一个额外的冒号分隔符):

DateAgeFilter:maxLookBack:'hireDate' 

下面是改变你的过滤器来使用,与2个变化的一个例子:

1)额外的参数 - 我把它称为field这里。

2)为了要使用的参数来指定属性,我们从点符号切换到托架notation-改变items[i].hireDate.getTime()items[i][field].getTime()

app.filter('DateAgeFilter', function(){ 
    return function(items, maxage, field) { 

    var minDate = new Date() 
    minDate.setMonth(minDate.getMonth() - maxage); 

    var result = []; 
    for (var i=0; i<items.length; i++) { 
     if (items[i][field].getTime() > minDate.getTime()) { 
     result.push(items[i]); 
     } 
    } 

    return result; 
    }; 
}); 

updated plunker

相关问题