Meteor:Publish函数返回整个集合而不是一个对象

时间:2013-08-02 18:30:46

标签: javascript meteor publish-subscribe

所以我想订阅一个只返回集合中一个对象的发布函数。

Meteor.publish("singleobject", function(bar) {
    return MyCollection.find({foo: bar});
});

这应该给我收集“MyCollection”的SINGLE一个对象,其中foo属性等于“bar”,对吗? (只有一个对象,这是真的...所以findOne()也应该工作)。它的作用是将我的所有对象归还给我,即使那些foo不等于bar的对象。

它与另一个集合完美配合,其中有多个对象,其中foo:“bar”为真。 我真的不明白我做错了什么。我是否可以订阅只返回一个对象的发布函数?

任何人对此都有任何想法?! : - )

最好的问候 帕特里克

2 个答案:

答案 0 :(得分:3)

您使用的代码:

Meteor.publish("singleobject", function(bar) {
    return MyCollection.find({foo: bar});
});

不会返回一个对象,而是 foo等于bar的每个对象。如果您只想要一个(无论哪一个),您应该使用findOne代替:

Meteor.publish("singleobject", function(bar) {
    return MyCollection.findOne({foo: bar});
});

如果您还看到具有foo !== bar的对象,则表示您在其他地方获取它们。有两种可能的解释:

  • 您有同一个集合的另一种发布方法,或
  • 您仍然有autopublish个包。

照顾好这两件事,你应该没事。


对于订阅,这是通常的模式:

Deps.autorun(function(){
    Meteor.subscribe('channel');
});


如果您希望订阅只是不时工作,那么实现它的方法很少。

最简单的方法是在订阅中添加一个布尔参数,并且只有在希望通道工作时才将其设置为true。在发布方法中,如果标志为false,则只返回null

更简洁的方法是跟踪您的所有订阅句柄,并在此时不想使用的人上调用stop()。这很好,但很难在这个版本的Meteor中推荐,因为一切都必须手动完成,这增加了一些不太必要的工作。

答案 1 :(得分:0)

所以......不要把

Meteor.subscribe()

里面的

Meteor.autorun()

Deps.autorun()

。 Meteor.autorun()/ Deps.autorun()内的所有内容都会被执行,即使它位于模板特定的.js文件中。我认为这些js文件中的每一个只在加载相应模板时加载,这当然是完全错误的。 这仅适用于正确构建您的应用程序。

因此,如果您想根据加载的模板订阅发布函数,请将Meteor.subscribe放入路由器回调函数并订阅。

现在适合我的作品! :)