我正在尝试制作一个非常简单的应用程序,可以发布帖子。我希望帖子页面上的每个条目都按{ createdAt: -1 }
排序。当我第一次访问该页面时,这是有效的。但是,当我发布新帖子时,它会附加到页面底部。
(注意最新帖子在底部)。当我重新加载页面时,它确实可以正常工作和排序,但在提交后,它会立即显示在底部。
我的服务器端代码如下(/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 :(得分: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}});
}
});