重叠的流星出版物 [英] Overlapping Meteor publications
问题描述
我有一个流星应用程序,其中有2种出版物.一种用于所有帖子,另一种用于特色帖子.有2个精选帖子-帖子1"和帖子4".我在所有页面上显示特色帖子,同时我按名称对所有帖子(包括特色帖子)进行分页.当我在页面之间旅行时,来自2个出版物的数据会混淆并且显示不正确的结果.
I have a meteor app which has 2 publications for posts. One for all posts and one for featured posts. There are 2 featured posts - "Post 1" and "Post 4". I show featured posts on all pages, while i paginate all posts (including the featured posts) sorted by name. When i travel between pages, the data from the 2 publications get mixed up and show incorrect results.
这是代码:
Meteor.publish('posts', function(page) {
const skip = parseInt(page && page !== '' ? page : 0) * 3
return Posts.find({}, {
limit: 3,
skip,
sort: {
name: 1
}
});
});
Meteor.publish('featured', function() {
return Posts.find({
featured: true
}, {
sort: {
name: 1
}
});
});
在客户端上我要同时订阅和显示2个循环中的数据
On the client I am subscribing to both and displaying the data in 2 loops
Template.hello.onCreated(function helloOnCreated() {
const instance = this;
instance.autorun(function() {
instance.subscribe('posts', FlowRouter.getParam('page'))
instance.subscribe('featured')
});
});
Template.hello.helpers({
posts() {
return Posts.find({}, {
limit: 3,
sort: {
name: 1
}
})
},
featured_posts() {
return Posts.find({
featured: true
}, {
sort: {
name: 1
}
});
}
});
HTML模板如下:
<template name="hello">
<h2>Featured</h2>
{{#each featured_posts}}
{{> post}}
{{/each}}
<h2>Posts</h2>
{{#each posts}}
{{> post}}
{{/each}}
</template>
问题是2个订阅中的数据在显示中混杂在一起.
The problem is the data from the 2 subscriptions are getting mixed up in the display.
在第1页上,它可以正确显示:
On page 1 it shows it correctly:
Page 1
Featured
post 1
post 4
All Posts
post 1
post 2
post 3
但是当我转到第2页
Page 2
Featured
post 1
post 4
All Posts -- Should be
post 1 post 4
post 4 post 5
post 5 post 6
它在职位"中显示了职位1",但该功能不应该出现在页面2上.当我转到页面3时,我看到了职位1"和职位4",但它们不应该在那儿.
It shows "post 1" inside the "posts" which is featured but shouldn't be on page 2. When I go to page 3, i see "post 1" and "post 4" but they should not be there.
我了解发布和订阅的工作方式以及发生这种情况的原因-因为发布会合并数据集.我想知道是否有解决方法可以将它们分开?
I understand how the publications and subscriptions work and why this is happening - because the publications merges the dataset. I am wondering if there is a work around to keep them separate?
推荐答案
如果我理解正确,则您的页面与所有帖子"列表的分页相对应. 页面"号作为您的订阅参数发送,因此您会收到简短的帖子列表.
If I understand correctly, your pages correspond to pagination of your "All Posts" list. The "page" number is sent as your subscription parameter, so that you receive a short list of your posts.
这里的困难确实是您的客户集合中没有手头的所有文档(因为您在'posts'
出版物中限制了它们),因此您不能使用与出版物中类似的skip
逻辑.
The difficulty here is indeed that your Client collection does not have all your documents in hand (since you limit them in your 'posts'
publication), so you cannot use a similar skip
logic as in the publication.
根据《流星指南》的建议> 分页订阅,您可以使用 percolate:find-from-publication
Atmosphere软件包可轻松检索来自'posts'
出版物的文档,只有它们.
As proposed in Meteor Guide > Paginating subscriptions, you could use the percolate:find-from-publication
Atmosphere package to easily retrieve the documents that come from your 'posts'
publication, and only them.
// Server
FindFromPublication.publish('posts', function(page) {
// Same logic
const skip = parseInt(page && page !== '' ? page : 0) * 3
return Posts.find({}, {
limit: 3,
skip,
sort: {
name: 1
}
});
});
// Client (no change in subscription)
Template.hello.helpers({
posts() {
return Posts.findFromPublication('posts', {}, {
sort: {
name: 1
}
});
} // (no change in featured_posts)
});
这篇关于重叠的流星出版物的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!