你的问题有点模糊,但希望我的回答对你有所帮助。
我在meteorpad 上创建了一个解决方案,您可以使用它来看看它是如何工作的。
在main.html 中,list 模板的数据上下文由{{#each days}} 设置,这是一个数组的数组。在这个外部 #each 循环中遍历外部数组。内部数组是一个简单的 2 元素数组,其第 0 个元素是字符串“today”或“in a day”等,而第一个元素又是一个数组,其中包含按天分组后来自数据库的对象,并且这些对象的 item 值显示在给定日期的每个项目的内部 {{#each this.[1]}} 循环中。
// main.html
<body>
{{> list}}
</body>
<template name='list'>
{{#each days}}
{{this.[0]}}
{{#each this.[1]}}
<div>{{item}}</div>
{{/each}}
<br>
{{/each}}
</template>
/client/app.js 通过使用链式underscore.js 函数映射、过滤、分组和再次映射来自数据库的文档,返回days 数据上下文。第一个 map 将时间设置为给定日期的开始,filter 仅将特定日期之后的文档留在外部数组中,然后是日期 group,最后是第二个 @ 987654335@ 只是给你today 代替默认字符串,并保留in a day、in 2 days 等字符串。
此外,在包含的 moment.js 包中,您可以重置时差阈值,以便始终以天为单位测量时差,而不是默认的秒、分钟、小时等。
// client/app.js
moment.relativeTimeThreshold('h', 0);
moment.relativeTimeThreshold('s', 0);
moment.relativeTimeThreshold('m', 0);
Template.list.helpers({
days: function() {
var ret = _.chain(Days.find().fetch())
.map(function(day) {
return {_id: day._id, dateTime: moment(day.dateTime).startOf('day')._d, item: day.item};
})
.filter(function(day) {
return moment(day.dateTime) >= moment([2015,7,5])
})
.groupBy(function(day) {
return moment(day.dateTime).from([2015, 7, 4]);
})
.map(function(v, k) {return k === "1 days ago" ? ["today", v] : [k, v]})
return ret._wrapped;
}
});
/common.js 在数据库days 集合上创建Days 句柄。
// common.js
Days = new Mongo.Collection("days");
而/server/app.js 只是将一些文档注入到数据库中。
// server/app.js
Meteor.startup(function () {
if (Days.find().count() === 0) {
var entries = [
{
dateTime: new Date('2015-08-04 09:01:01'),
item: "-Zeroth"
},
{
dateTime: new Date('2015-08-05 11:01:01'),
item: "-First"
},
{
dateTime: new Date('2015-08-05 17:02:11'),
item: "-Second"
},
{
dateTime: new Date('2015-08-09 12:11:07'),
item: "-Third"
},
{
dateTime: new Date('2015-08-09 21:23:18'),
item: "-Fourth"
}
];
_.each(entries, function (entry) {
Days.insert({
dateTime: entry.dateTime,
item: entry.item
});
});
}
});