【问题标题】:Subscription never populates Meteor collection using iron-router订阅永远不会使用 Iron-router 填充 Meteor 集合
【发布时间】:2014-03-17 22:01:26
【问题描述】:

在这个Meteor app 中,我有一个Meteor 集合和几个subscribe 调用,它们应该用服务器发布的至少一条记录来填充它。此外,还有 Iron-router wait() 调用它。但是,该集合永远不会被填充。服务器确实发送记录,因为客户端预先订阅的另一个集合接收了它。

问题是also on GitHub,以防它被证明是一个错误。

【问题讨论】:

  • 这不是预期的行为吗?它再次运行,以便检查 .wait() 以查看订阅是否完成。数据类型的东西(查看集合)放在data 键中,除非发生反应性更改,否则它不会再次运行。
  • 您能提供一个带有代码的示例吗?
  • @hharnisc:我在问题的第一行链接到了回购协议?

标签: collections meteor publish-subscribe iron-router


【解决方案1】:

我认为可能有两个问题。

首先是发布的数据最终出现在客户端的集合中,Books。那是它在服务器上的集合,如果发布返回游标,它最终会出现在客户端上。仔细查看文档中的 counts-by-room 示例,了解发布订阅名称如何匹配,但需要使用自定义 'add()、remove()、changed() 块设置集合名称以管理客户端上的名称与服务器上的名称不同。

第二个问题是您如何检查客户端上的数据。 Iron-router 等待订阅句柄的 ready() 返回 true。但这只是意味着服务器已经发送了所有数据。来自 ready() 上的文档 - “如果服务器已将订阅标记为就绪,则为 True。一个反应式数据源。”

所以服务器已经发送了所有数据,但它可能还没有在客户端上。因此,您始终需要检查您想要的数据是否在那里,并且永远不要仅仅因为订阅准备好()就认为所有数据都已到达。

尝试将此添加到您的客户端代码中:

Deps.autorun( function(){
   // replace this.params.name with the name because it is no longer in scope
   console.log( Books.findOne( {name: this.params.name} )); 

});

而且我认为它会在订阅准备好后很快记录您正在寻找的数据。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2017-01-19
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多