2014-12-03 29 views
1

我有一个包含“startDate”属性的“事件”对象数组。我编写了一个自定义过滤器“occurrenceToday”,它预期会返回一个startDate属性与过滤器函数中定义的“today”变量匹配的事件数组。下面的代码是我试图测试我的自定义过滤器。没有事件显示,但有预期的匹配。控制台中也没有引发错误。我错过了什么或误解?谢谢。为什么这个自定义的Angular过滤器没有返回任何预期的匹配?

JS:

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


myApp.filter('occursToday', function() { 
    return function (events) { 
    var today = new Date('12/1/2014'); 
    var filtered = []; 
    for (var i = 0; i < events.length; i++) { 
     var evnt = events[i]; 
     if (evnt.startDate === today) { 
     filtered.push(evnt); 
     } 
    } 
    return filtered; 
    }; 
}); 


myApp.controller('MainCtrl', function($scope){ 
    $scope.greeting = 'Hello world!'; 
    $scope.events = [ 
     {"name": "An Event", "venue": "A Park", "startDate": new Date('12/1/2014'), "startTime": new Date('12/1/2014'), "endDate": new Date('12/1/2014'), "endTime": new Date('12/1/2014'), "website": "www.example.org", "description":"Yada yada.", "details": "Blah blah."}, 
     {"name": "An Event", "venue": "A Park", "startDate": new Date('12/1/2014'), "startTime": new Date('12/1/2014'), "endDate": new Date('12/1/2014'), "endTime": new Date('12/1/2014'), "website": "www.example.org", "description":"Yada yada.", "details": "Blah blah."}, 
     {"name": "An Event", "venue": "A Park", "startDate": new Date('12/2/2014'), "startTime": new Date('12/2/2014'), "endDate": new Date('12/2/2014'), "endTime": new Date('12/2/2014'), "website": "www.example.org", "description":"Yada yada.", "details": "Blah blah."}, 
     {"name": "An Event", "venue": "A Park", "startDate": new Date('12/2/2014'), "startTime": new Date('12/2/2014'), "endDate": new Date('12/2/2014'), "endTime": new Date('12/2/2014'), "website": "www.example.org", "description":"Yada yada.", "details": "Blah blah."}, 
     {"name": "An Event", "venue": "A Park", "startDate": new Date('12/3/2014'), "startTime": new Date('12/3/2014'), "endDate": new Date('12/3/2014'), "endTime": new Date('12/3/2014'), "website": "www.example.org", "description":"Yada yada.", "details": "Blah blah."}, 
    ] 
}); 

HTML:

<!DOCTYPE html> 
<html lang="en" ng-app="myApp"> 
    <head> 
    <meta charset="utf-8"> 
    <title>myApp</title> 
    <link rel="stylesheet" href="css/main.css"> 
    </head> 
    <body ng-controller="MainCtrl"> 

     <div class="upcoming_events"> 
     <h2>Today</h2> 
      <ul class="event_list"> 

      <li ng-repeat="event in events | occursToday"> 
       <div class="event"> 
       <div class="event_date"> 
        <span class="day_of_week">{{event.startDate | date: 'EEEE'}}</span><br> 
        {{event.startDate | date: 'mediumDate'}} 
       </div> 
       <div class="event_content"> 
        <a class="summary" href="#">{{event.name}}</a> 
        <time class="start-time">{{event.startTime | date: 'shortTime'}}</time> 
        – 
        <time class="end-time">{{event.endTime | date: 'shortTime'}}</time> 
        <a class="location" href="#">{{event.venue}}</a> 
       </div> 
       </div> 
      </li> 

      </ul> 
     </div> 

回答

1

您可能需要使用

 evnt.startDate.getTime() === today.getTime() 
+0

以上是我提供的代码正确的答案。然而,为了任何人的利益使用这个作为参考,我想澄清一下,如果两个Date对象在确切的时间点实例化,上述将只返回true。对于一个更一般的过滤器,它将匹配相同日期的Date对象,而不管一天中的哪个时间,所使用的条件必须是'if(evnt.startDate.getFullYear()=== today.getFullYear()&& evnt .startDate.getMonth()=== today.getMonth()&& evnt.startDate.getDate()=== today.getDate())' – metamas 2014-12-03 22:15:25

+0

其实这并不完全正确。如果您将日期实例化为新日期('12/25/2015'),则无论您创建日期为何,它都将初始化为2015年12月25日星期五00:00:00 GMT-0800(PST)。当以这种方式实例化时,hh:mm:ss默认不包含在内。 – Scott 2014-12-03 22:39:12

+0

是的,没错。我的意思是,在上述代码的最终版本中,'today'变量将初始化为'today = new Date()',以便它自动匹配给定的一天,但'new Date()'实例化一个时间下降到当前毫秒,而'evnt.startDate'将以上面描述的归零时间格式启动。所以我确实需要使用更冗长的条件来匹配日期。 – metamas 2014-12-08 20:36:31

相关问题