javascript - 如何过滤 Angular ng-repeat 以使用日期范围?

标签 javascript angularjs

所以我正在使用 ng-repeat 列出有关事件的一些信息,其中之一是日期字段。我想过滤日期,例如,能够显示 future 30 天内的事件。我不确定要采取什么方向来实现这一目标。

<table>
<tr>
    <th>Title</th>
    <th>Description</th>
    <th>Start Time</th>
</tr>
<tr ng-repeat="eventData in eventListData  | orderBy:'+StartDateTime'">
  <td>{{eventData.Title}}</td>
  <td>{{eventData.Description}}</td>
  <td>{{eventData.StartDateTime|date:'d MMM yyyy'}}</td>
</tr>
</table>

最佳答案

首先,orderBy 的语法是错误的。它应该是“orderBy:'+StartDateTime'”,其中 +/- 控制升序/降序方向,而“StartDateTime”(注意单引号)是要提取的字段。

为 StartDate 使用时间戳并执行 > 现在 - < 现在 + 30 天,然后你有 2 个选项:

  • 在到达您的 View 之前过滤模型数组
  • 制作 Angular 过滤器并使用它

我更喜欢第二个选项,我觉得它更符合 Angular 的精神,并且允许更动态地处理数据。我做了一个例子here

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

// filter array by @field {String}
// return items from today to @days {Number} from now
// eg: events | upComing:'StartDateTime':30
app.filter('upComing', function(){
  return function(items, field, days){
    var timeStart = Date.now();
    var timeEnd = Date.now() + (days * 86400000); // 1 day in ms
    return items.filter(function(item){
      return (item[field] > timeStart && item[field] < timeEnd);
    });
  };
});

app.controller('ctrl', function($scope){
  // demo data, StartDateTime should be numbers in your data
  $scope.eventListData = [
   {
     Title:'Event 1 (last in 30 dys)',
     Description:'A cool Event',
     StartDateTime: Date.now() + (86400000 * 5) // in 5 days
   },
   {
     Title:'Event 2 (next)',
     Description:'A cool Event',
     StartDateTime: Date.now() + 86400000 // in a day
   },
   {
     Title:'Event 3 (next next)',
     Description:'A cool Event',
     StartDateTime: Date.now() + (86400000 * 2) // in 2 days
   },
   {
     Title:'Too-far-away Event',
     Description:'A cool Event',
     StartDateTime: Date.now() + (86400000 * 40) //  in 40 days
   },
   {
     Title:'Already-happend Event',
     Description:'A cool Event',
     StartDateTime: Date.now() - (86400000 * 2) //  2 days ago
   }
  ];
});

这是 HTML:

<html ng-app="app">
<head>
<meta charset=utf-8 />
<title>Angular Date Filter</title>
</head>
<body ng-controller="ctrl">
<table>
<tr>
    <th>Title</th>
    <th>Description</th>
    <th>Start Time</th>
</tr>
<tr ng-repeat="eventData in eventListData  | upComing:'StartDateTime':30 | orderBy:'+StartDateTime'">
  <td>{{eventData.Title}}</td>
  <td>{{eventData.Description}}</td>
  <td>{{eventData.StartDateTime|date:'d MMM yyyy'}}</td>
</tr>
</table>
</body>
</html>

关于javascript - 如何过滤 Angular ng-repeat 以使用日期范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642449/

相关文章:

javascript - javascript如何获取其他网站的数据?

javascript - 我添加自定义过滤器来解决允许跨原点的问题,但仍然拒绝 Angular 仅发送选项方法,并且不发送 get 或 post

angularjs - Angular 支持散列和普通 url?

javascript - ajax每次点击 "load more"按钮加载2条记录

javascript - 谷歌地图 api 方向服务在显示多个标记 javascript 之间的路线时提供 OVER_QUERY_LIMIT

javascript - fs.appendFile 没有按顺序追加数据?

javascript - 重叠元素 - HTML、CSS 和 jQuery

javascript - 运行多行代码的 Angular 三元表达式

Angularjs 从 DOM 中删除自定义指令和子指令

javascript - 来自多个字段的 Angular Typeahead 过滤器