【问题标题】:Several subscriptions for the same collection in MeteorJSMeteorJS 中同一集合的多个订阅
【发布时间】:2015-08-21 23:18:55
【问题描述】:

我正在寻找使用 MeteorJS 完成以下任务的最佳方法。

要求如下:带有项目的列表,以及带有所选项目的侧栏(列表的当前页面不是必需的)。

我需要向客户端发送两个相同的 Items 集合:

  • 列表当前页面的项目
  • 侧栏的一项

我应该与出版物/订阅者跳什么舞?

这对我来说如何正确地做到这一点并不明显。

目前,我为列表和选定项目添加了两个发布,在客户端订阅了这两个发布。结果,当我在客户端执行 Items.find() 来填充列表时,它返回给我列表页面项目 + 选定项目(“项目 5”出现在第一页上)。

It is OK when selected item should be on current page of the list ("Item 2"), but it is NOT OK when selected item should not be there and it's added to the current page anyway ("Item 5") .

【问题讨论】:

  • 我也会使用两个 pub/sub。首先是列出您的项目。然后,您希望将所选项目的 id 存储在一个数组中,您可以使用 Session.getSession.set 来存储它。您的第二个 pub 将接收一个 arg,即该数组。并且会返回所有 ids 在该数组中的文档。
  • @KassymDorsel 是的,但是如果您有来自同一个集合的 pub,当您在客户端执行 Items.find() 时,您会收到来自两个 pub 的 merge 项目。 。 正确的?这就是我所面临的。列表包含不应该存在的项目。
  • 如果我添加代码片段对理解我的问题有帮助吗?
  • 是的,集合中的所有数据都将在客户端中合并。这就是使用不同的 subs 的地方。即使所有项目都在客户端 minimongo 中,订阅者控制发送到要显示的视图的内容。从技术上讲,您可以拥有一个支持两个潜艇的 pub。今晚我可能有时间把一个例子放在一起。看看这个帖子,可能会有所帮助:stackoverflow.com/questions/19826804/…
  • @KassymDorsel 那篇文章几乎解释了我迫切地想出的东西。即union文档,需要在客户端duplicate find()查询。我仍然无法获得的一项,(这就是 Michel 提出的)-相同的查询如何与基于跳过/限制的分页一起正常工作?当我切换到第二页并在客户端控制台中执行 Items.find().fetch() 时,我只从第二页获得了项目。现在,如果我在服务器上执行相同的 skip 操作,它只会隐藏第二页上的所有项目。客户端上的第一页和第二页中的项目也没有聚合......

标签: javascript meteor


【解决方案1】:

您使用两个发布和两个订阅的方法是正确的。结果是客户端上的集合将包含来自两个 pubsub 的数据的联合。鉴于这两个发布执行不同的查询,您需要客户端上的两个视图在本地集合上执行相同的查询。正如@KassymDorsel 所说,会话变量或反应变量可能对管理状态很有用。

【讨论】:

  • 我尝试了相同的列表查询,它破坏了我的分页。为什么会有帮助?服务器发布跳过/限制项目的帧并发送到客户端。客户端跳过/限制类似,但在从服务器接收到的帧上。显然,从第二页开始,我没有具有相同查询的项目...
  • A pubsub 添加 文档到客户端 minimongo 数据库。模板助手中的 查询 从客户端 minimongo 数据库中选择这些文档的子集以在 UI 中使用。
  • 嗯.. 很有趣。如果它会 add 文档,它可能会在我从第一页开始并单击第二页及更远时起作用。项目将在 minimongo 和相同的查询跳过/限制帧中正确聚合。但是如果我从 url 获取当前页面呢?如果我先翻第一页然后翻第三页怎么办? Minimongo db 不会复制确切的服务器收集状态,对吧?如果它会添加。但我没有看到添加:打开第一页,转到控制台,Items.find().fetch() == 第一页中的项目。转到第二页, Items.find().fetch() == 第二页中的项目。本地数据库中没有页面联合。有什么想法吗?
  • Minimongo 复制服务器状态。你在使用分页包吗?在大气js上有几个流行的。如果侧边栏项目始终只有一个,则可以使用 findOne() 而不是 find() 检索它
  • 我用于分页的唯一包是“tmeasday:publish-counts”,因为在 Meteor 中发布总项目数令人惊讶地不是显而易见的任务。我已经将 Items.findOne() 用于选定的项目。
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多