2013-08-02 125 views
1

所以我想订阅一个发布函数,它只返回一个集合的一个对象。流星:发布函数返回整个集合而不是一个对象

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

这应该给我集合“MyCollection”的单一对象,其中foo属性等于“bar”,对吧? (只有一个对象,这是真的...所以findOne()也应该工作)。它所做的却是将我收藏的所有物品返还给我,甚至是那些foo不等于酒吧的物品。

它适用于另一个集合,其中有多个对象,其中foo:“bar”为真。 我真的不明白我在做什么错。我是否可以不订阅仅返回一个对象的发布函数?

任何人有任何想法呢? :-)

问候 帕特里克

回答

0

所以......不要把

Meteor.subscribe() 

Meteor.autorun() 

Deps.autorun() 

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

所以,如果你想订阅根据加载该模板的发布功能,把Meteor.subscribe进入路由器回调函数和订阅那里。

现在完美适合我! :)

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

+1 @HubertOG目前有1337的声望,所以你一定要听他的。 –

+0

谢谢@HubertOG!所以问题在于我在Meteor.autorun()中订阅了我的订阅,而现在我认为这是不正确的。所以......试图把订阅功能Template.templatename.created =函数(){}内部的,但由于某种原因,还是不对。 通过标准的href链接切换到另一个页面( - >加载另一个模板)之前,模板的旧订阅仍然完好无损。那么,如果我希望它们是特定于模板的,我会在哪里放置订阅? ()' –

+0

几个流星版本前'Meteor.autorun()'用'Deps.autorun替换 - 看到更新后的答案。 –

相关问题