meteor.js:理解出版

时间:2014-03-21 12:30:53

标签: meteor publish-subscribe

我最近开始使用Meteor,有一件事我还是不了解(至少不完全是)发布机制。例如,请考虑以下代码(我已禁用autopublish btw):

file:client / lib.js

var lists = new Meteor.Collection('List');
Meteor.subscribe("Categories");

Template.categories.lists = function () {
     return lists.find({}, {sort: {Category: 1}});
};

file:server / lib.js:

var lists = new Meteor.Collection('List');
Meteor.publish("Categories", function() {
   return lists.find({},{fields:{Category:1}});
});

2个问题:

  • 我应该在每个文件中定义lists集合吗?
  • Meteor.subscribe("Categories");如何知道更新lists变量?

我的其他问题是关于以下代码:

file:client / lib.js:

Meteor.autosubscribe(function() {
    Meteor.subscribe("listdetails", Session.get('current_list'));
});

file:server / lib.js:

Meteor.publish("listdetails", function(category_id){
   return lists.find({_id:category_id});
});

我认为发布listdetails后,新列表会从current_list推送到Session。我不明白为什么你不能简单地做

Meteor.subscribe("listdetails", Session.get('current_list'));

此外,我注意到这些天您应该使用Deps(依赖关系)对象。有人可以使用Deps为我翻译此示例吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

  

我应该在每个文件中定义列表集合吗?

不,多次评估new Meteor.Collection('<name>')(使用相同的<name>)会出现错误There is already a collection named '<name>'。仅评估一次并将其存储在全局变量中。

  

Meteor.subscribe(“类别”)如何;知道更新列表   变量?

它只是知道如何。作为使用Meteor的普通程序员,您不需要知道如何使用。至少我不会告诉你怎么做,但这已经不是什么秘密了:整个框架都可以在github上找到,如果你有兴趣,可以查看那里的代码。

  

我的其他问题是关于以下代码:

您可以使用Meteor.subscribe("listdetails", Session.get('current_list'));,但订阅只会使用此时获得的值Session.get('current_list')。通过使用 Deps.autorun(function() { Meteor.subscribe("listdetails", Session.get('current_list')); }); 相反,每次Session.get('current_list')更改(评估Session.set('current_list', <new-value>)时)都会重新创建订阅。

您应该使用Deps.autorunMeteor.autorunMeteor.autosubscribe已退役。

答案 1 :(得分:2)

  

我应该在每个文件中定义列表集合吗?

没有。实际上,您无法在客户端上定义两次相同的集合,您将收到错误(可能在服务器上也是如此,我不记得了)。您要做的是将其定义为全局变量。为此,请在定义时删除var关键字。使用var定义的变量是您定义它们的文件的本地变量,没有它的变量是全局变量。

另请注意,不公平的约定是使用大写字母命名集合,使用小字母订阅,因此您可能希望将代码更新为Listscategories以提高可读性。

  

Meteor.subscribe(“类别”)如何;知道更新列表变量吗?

您从通道中的该集合返回游标,并将光标传递到客户端上的相应集合。请注意,重要的不是变量名,而是调用new Meteor.Collection时传递的参数。

  

有人可以翻译......

您发布的示例已过时。不再有Meteor.autorun函数,而是名为Deps.autorun。这就是您需要的所有翻译。您可以阅读有关Deps及其工作原理in the documentation

  

我不明白为什么你不能简单地做...

这将使用Session变量的当前值作为参数调用一次订阅。如果您希望订阅在值更改时重新运行,则需要调用称为“反应式上下文”的内容(有关详细信息,请参阅Deps文档)。实现此目的的默认方法是将您的调用放在Deps.autorun方法中。执行此操作时,每次Session变量中的值发生更改时,都会更新订阅 - 这是您使用Session的主要原因。