流星;发布后不立即在客户端上排序

时间:2015-03-02 15:35:17

标签: javascript meteor

我正在尝试制作一个非常简单的应用程序,可以发布帖子。我希望帖子页面上的每个条目都按{ createdAt: -1 }排序。当我第一次访问该页面时,这是有效的。但是,当我发布新帖子时,它会附加到页面底部。

the latest post is at the bottom

(注意最新帖子在底部)。当我重新加载页面时,它确实可以正常工作和排序,但在提交后,它会立即显示在底部。

我的服务器端代码如下(/server/publications.js):

Meteor.publish('posts', function(limit) {
  limit = limit || Meteor.settings.public.pageLimit;
  check(limit, Number);
  var options = {
    sort: { createdAt: -1 },
    limit: limit
  };
  return Posts.find({}, options);
});

在我的客户端,我有这个(/client/subscriptions.js):

Meteor.subscribe('posts');

如何在提交后立即正确排序帖子?

4 个答案:

答案 0 :(得分:4)

我认为解决方案非常明显:您应该在客户端进行排序,而不是服务器端。我猜你有一个包含帖子查询的辅助函数?在那里添加排序。

基本解释:Meteor尝试在插入/更新时将最少量的信息推送到客户端。我猜它没有完全重新运行订阅服务器端,这是你期望的,但它只发送最后添加的元素,它被附加到客户端集合。

(注意:要100%正确,你需要在两侧进行排序,因为你也限制了结果集的大小,你只想推送最新的。)

答案 1 :(得分:1)

让我们订阅被动反应。

Tracker.autorun(function(){
  Meteor.subscribe('posts');
}

为什么不做一个简单的Publish-Subscribe

并使用这个助手?在clien方面。

Template.postsExample.helpers({
  posts: function() {
    return Posts.find({}, {sort: {submitted: -1}});
  }
});

答案 2 :(得分:1)

你可以尝试一下并让我知道吗?

Meteor.publish('posts', function(limit) {
  limit = limit || Meteor.settings.public.pageLimit;
  check(limit, Number);
  var options = {
    sort: {submitted: -1},
    limit: limit
  };
  return Posts.find({}, options);
});

答案 3 :(得分:0)

由于您正在使用排序和限制来检索最新的帖子,因此您需要像现在一样继续发布该功能。发布功能中的排序允许服务器仅向客户端发送最新的[限制]帖子。

当添加新帖子时,服务器不会获取所有文档,它只会发送新添加内容,该附加内容将添加到客户端上的Minimongo中。客户端可以对从Minimongo绘制的记录进行排序。

如果你的模板是这样的:

<template name="listOfPosts">
    {{#each posts}}
        <div>{{content}}</div>
        <div>Submitted by: {{author}}</div>
        <div>{{submitted}}</div>
    {{/each}}
</template>

然后,提供模板的助手应该有一个排序说明符:

Template.listOfPosts.helpers({
    posts: function() {
        return Posts.find({}, {sort: {submitted: -1}});
    }
});