ng-repeat:仅按日期的时间部分排序

时间:2016-01-27 08:35:07

标签: javascript angularjs angularjs-ng-repeat

想象一下,您有一组数据,其中包含一个实际上是日期/时间戳的属性。可能有任何天数,但在这种情况下,日期的唯一部分是日期的时间部分。

如何仅使用TIME来对ng-repeat表达式中的集合进行排序?以前需要某种操作吗?

我正在尝试使用moment.js在数据库中填充后立即替换时间戳属性。

angular.forEach($scope.timeSlots, function (timeSlot, index) {
    timeSlot.BeginTime = moment(timeSlot.BeginTime).format("hh:mm A");
    timeSlot.EndTime = moment(timeSlot.EndTime).format("hh:mm A");
});

在模板中使用此值时,排序时仍会考虑日期。因此,根据添加时间的日期,它们可能会出现故障。

<tr ng-repeat="timeSlot in timeSlots | orderBy: 'BeginTime'">

我还尝试将新属性完全添加到timeSlot对象,然后按此排序。不幸的是,时间戳的日期部分似乎仍然存在。

角度控制器:

angular.forEach($scope.timeSlots, function (timeSlot, index) {
    timeSlot.BeginTimeDisplay = moment(timeSlot.BeginTime).format("hh:mm A");
    timeSlot.EndTimeDisplay = moment(timeSlot.EndTime).format("hh:mm A");
});

角度模板:

<tr ng-repeat="timeSlot in timeSlots | orderBy: 'BeginTimeDisplay'">

2 个答案:

答案 0 :(得分:2)

为什么不自己计算时间戳:

var date = new Date;
date.setTime(timeSlot.BeginTime);

var seconds = date.getSeconds();
var minutes = date.getMinutes();
var hours = date.getHours();

timeSlot.ts = hours*60*60+minutes*60+seconds;

然后     <tr ng-repeat="timeSlot in timeSlots | orderBy: 'ts'">

答案 1 :(得分:0)

我认为您应该将时间转换为秒数,并保存在BeginTimeDisplay和EndTimeDisplay中,除非您显示这些属性,在这种情况下,您应该将它们保存在不同的属性中。如果这样做,orderBy angularJS子句应该可以轻松工作。