2014-02-18 55 views
-3

在这Meteor app我有一个流星收集和几个subscribe调用,应该填写它至少有一个服务器发布的记录。此外,还有铁路路由器wait()。但是,该集合永远不会被填充。服务器确实发送记录,因为客户预先订阅的另一个集合接收它。订阅永远不会填充流星采集使用铁路由器

问题是also on GitHub,以防万一它变成了一个bug。

+0

这不是预期的行为?它再次运行,以便检查.wait()以查看订阅是否完成。数据类型的东西(窥探到集合)进入'data'键,除非发生反应性变化,否则它不会再运行。 – Akshat

+0

你可以包含一个代码示例吗? – hharnisc

+0

@hharnisc:我在我的问题的第一行中链接了回购? –

回答

1

我想可能有2个问题。

首先是发布的数据最终在客户端的集合Books中。这就是它在服务器上的集合,如果发布返回一个游标,它将在客户端上结束。仔细查看文档中逐个计数的示例,并查看发布订阅名称如何匹配,但需要使用自定义的“added()”,“remove()”,“changed()”块来设置集合名称以管理客户端上的名称与服务器名称不同。

第二个问题是您如何检查客户端上的数据。铁路由器等待订阅句柄的ready()返回true。但是,这仅仅意味着服务器已经发送了所有数据。从ready()上的文档 - “如果服务器已将订阅标记为就绪,则为真”。一个被动数据源。

所以服务器发送了所有的数据,但它可能还没有在客户端。所以你总是需要检查你想要的数据是否在那里,并且从不认为所有的数据都是因为订阅已准备就绪()。

尝试增加给你的客户端代码:

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})); 

}); 

而且我认为它会记录你正在寻找后不久,订阅准备数据。

+0

关于第一个问题 - 确切地说,客户端和服务器上的集合名称必须匹配。我刚刚花了一两个小时写了这个答案[如何收集,订阅和出版物在流星中工作](http://stackoverflow.com/questions/19826804/understanding-meteor-publish-subscribe/21853298#21853298) ,并实现了同样的事情。 –