所以我想订阅一个只返回集合中一个对象的发布函数。
Meteor.publish("singleobject", function(bar) {
return MyCollection.find({foo: bar});
});
这应该给我收集“MyCollection”的SINGLE一个对象,其中foo属性等于“bar”,对吗? (只有一个对象,这是真的...所以findOne()也应该工作)。它的作用是将我的所有对象归还给我,即使那些foo不等于bar的对象。
它与另一个集合完美配合,其中有多个对象,其中foo:“bar”为真。 我真的不明白我做错了什么。我是否可以订阅只返回一个对象的发布函数?
任何人对此都有任何想法?! : - )
最好的问候 帕特里克答案 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放入路由器回调函数并订阅。
现在适合我的作品! :)