我有一系列帖子,每个帖子都有一个ISO时间戳(例如:“2014-08-11T16:34:39.334Z”)。我想按时间戳降序对帖子进行排序。
第一次加载页面时,一切正常。帖子按时间戳降序排序。
但是,当我添加新帖子时,新帖子会附加到列表的末尾,而不是显示在顶部,因为它应该(因为它的时间戳是最新的)。
我的路由器上有$ sort设置,按时间戳降序“-1”排序。
模板肯定是通过添加新帖子来“反应”,但不是以正确的顺序。
router.js
this.route('profile',{
path:'/profile',
waitOn:function(){
Session.set('profile',this.params.username);
return Meteor.subscribe('postsByOwner',this.params.username);
},
data:{
user:function(){
var username = Session.get("profile");
var user = Meteor.users.findOne({username:username});
if(user){
return user;
}
},
posts:function(){
return Posts.find({},{$sort:{timestamp:-1}});
}
}
});
profile.html
<template name="profile">
{{#if user}}
{{> profileCard user}}
{{/if}}
{{#if posts.count}}
{{> postsList}}
{{else}}
No posts!
{{/if}}
</template>
methods.js
savePost: function(fields) {
var user = Meteor.user();
if (!user)
throw new Meteor.Error(401, "You need to login to post!");
var d = new Date();
var timestamp = d.toISOString();
var post = _.extend(_.pick(fields, 'title', 'description'), {
owner: user._id,
timestamp : timestamp
});
postId = Posts.insert(post);
}
答案 0 :(得分:1)
首先,它是sort
,而不是$sort
。接下来,仅在硬刷新之后排序工作的事实告诉我,在通过Meteor的存根到达服务器之前,您正在添加到客户端上的posts
集合。每次添加新帖子时,您都可以通过在autorun
内的Template.profile.onCreated
功能重新订阅来避免这种情况。
现在我的意见是:你应该存储UNIX时间戳。由于UNIX时间戳是自UNIX纪元以来的毫秒数,因此对其进行排序是明确的。
如果您使用moment.js
,则只需moment().valueOf()
即可获取当前时间戳:
var post = _.extend(_.pick(fields, 'title', 'description'), {
owner: user._id,
timestamp : moment().valueOf();
});
如果您想使用vanilla JavaScript:
var post = _.extend(_.pick(fields, 'title', 'description'), {
owner: user._id,
timestamp : new Date().getTime();
});
您可以轻松地将UNIX时间戳转换为其他格式,例如
moment(unixTimeStamp).format('YYYY-MM-DD HH:mm:ss');