2015-03-02 120 views
2

我正在尝试制作一个非常简单的应用程序,可以发布帖子。我希望帖子页面上的每个条目按{ 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'); 

我怎样才能在提交后进行岗位排序正确立即?

+0

你在哪里调用客户端上的发现?你是否尝试过使用限制和排序在客户端以及服务器? – 2015-03-02 16:00:12

+0

@corvid如果您需要在客户端上订购文档,请在客户端进行分类。请参阅[本文](http://dweldon.silvrback.com/common-mistakes)的“排序发布”部分。 – 2015-03-02 17:04:03

回答

1

让我们让订阅被动。

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

为什么不制作一个简单Publish-Subscribe

,并使用这个帮手?在clien吨方。

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

不幸的是,这似乎没有按预期工作 – corvid 2015-03-02 15:56:39

+0

@corvid检查答案更新 – Ethaan 2015-03-02 16:01:24

+1

是的,这工作。似乎有点反直觉做到这一点在前端和后端 – corvid 2015-03-02 20:23:55

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); 
}); 
+0

唉,这并没有工作......我认为它与客户端 – corvid 2015-03-02 15:50:56

4

我认为解决的办法是相当明显的:你应该排序在客户端,而不是服务器端。我猜你有一个帮助函数,其中包含对帖子的查询?在那里添加排序。

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

(注意:是100%正确的,你需要双方的排序,你是限制结果集,以及和你只想最近要推的大小。)

+0

排序在客户端和服务器解决了我的问题,但这并不感觉很优雅 – API 2016-03-29 19:14:33

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}}); 
    } 
});