Meteor:onReady数据订阅

时间:2013-12-26 15:54:51

标签: meteor publish-subscribe

我正在尝试在中实现以下模式:服务器具有一些数据集,这些数据集作为较小的块发布到客户端,即客户端订阅数据的子集。

//server
Meteor.publish("dataWindow", function(){ 
   //publish a subset
   return Data.find({},{limit:100};});
});

//client
Meteor.subscribe("dataWindow", function onReady(){
//do stuff with dataWindow, but this doesn't work
//display(dataWindow)
});

但是,在客户端上使用此实现时,dataWindow为空。

我不明白的一些事情:

  • 在这种情况下,我在哪里放置集合定义?
  • 客户端是否有集合dataWindow?
  • 如何在onReadyformerly onComplete)中引用dataWindow?
  • 什么是iron-router,以及与onReady函数调用有什么关系?

1 个答案:

答案 0 :(得分:3)

我建议阅读meteor book以更好地了解流星的基本概念。我还建议您查看文档的publish and subscribe部分。如果对发布和订阅没有基本的了解,你可能很难理解你的问题的答案,但我会试一试:

在这种情况下,我在哪里放置集合定义?

因为它们在服务器和客户端之间共享,所以将定义放在应用程序目录下的目录中,例如: /collections/posts.js

Posts = new Meteor.Collection("posts");

我将在本答案的其余部分假设您的收集是Posts,因为Data有点过于通用。因此,您的发布功能可能如下所示:

Meteor.publish("postsForDashboard", function(){ 
   return Posts.find({}, {limit: 100});
});

您的订阅可能如下:

Meteor.subscribe("postsForDashboard");

客户端是否有集合dataWindow?

没有。发布函数的名称(在我们的示例中为postsForDashboard)只是一个标识符。文档将使用(Posts)中找到的相同集合发布到客户端。这也回答了你的第一个问题。

如何在onReady中引用dataWindow?

你没有。它只是用于选择发布功能的标识符。在我们的示例中,您可以这样做:

console.log(Posts.find().fetch());

请注意,直接使用回调进行订阅是很不寻常的。典型的用例是简单地订阅数据,然后在模板中使用它。

什么是铁路由器,以及与onReady函数调用有什么关系?

铁路由器是一种客户端路由器,当您希望在应用中拥有多条路由时(例如/ dashboard,/ posts,/ posts / abc123 / edit)非常有用。铁路由器的一个很好的功能是它可以等待您的数据准备就绪并相应地显示模板。例如,当您的帖子同步时,它可以显示一个微调器,当它们完成时,它可以显示一个显示它们的模板。同样,您不需要直接访问subscribe的回调以实现此目的。


我希望这会有所帮助,但我强烈建议您阅读以上资料,以便更好地了解这一切是如何运作的。