重叠的流星出版物 [英] Overlapping Meteor publications

查看:94
本文介绍了重叠的流星出版物的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个流星应用程序,其中有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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆