1

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

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

这应该给我集合“MyCollection”的单个对象,其中 foo 属性等于“bar”,对吧?(只有一个对象是这样的......所以 findOne() 也应该工作)。相反,它的作用是返回我收藏的所有对象,即使是 foo 不等于 bar 的对象。

它与另一个集合完美地工作,其中有多个对象,其中 foo: "bar" 为真。我真的看不出我做错了什么。我可以不订阅只返回一个对象的发布函数吗?

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

最好的问候帕特里克

4

2 回答 2

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。在发布方法中,null如果标志为假,则只需返回。

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

于 2013-08-02T18:47:34.490 回答
0

所以......不要放

Meteor.subscribe()

代替

Meteor.autorun()

或者

Deps.autorun()

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

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

现在非常适合我!:)

于 2013-08-02T19:49:11.867 回答