У меня есть метеорное приложение, в котором есть 2 публикации для постов. Один для всех сообщений и один для избранных сообщений. Есть 2 избранных поста - "Пост 1" и "Пост 4". Я показываю избранные сообщения на всех страницах, а все сообщения (включая избранные сообщения) разбиваю на страницы, отсортированные по имени. Когда я перемещаюсь между страницами, данные из двух публикаций смешиваются и показывают неверные результаты.
Вот код:
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 цикла
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>
Проблема в том, что данные двух подписок смешиваются на дисплее.
На странице 1 он показывает это правильно:
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», но их там не должно быть.
Я понимаю, как работают публикации и подписки и почему это происходит — потому что публикации сливают набор данных. Мне интересно, есть ли работа, чтобы держать их отдельно?