Meteor JS - 当新帖添加时,$ sort无效

时间:2014-08-11 16:52:59

标签: javascript mongodb sorting meteor

我有一系列帖子,每个帖子都有一个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);
}

1 个答案:

答案 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');

ref