所以我想订阅一个只返回集合中一个对象的发布函数。
Meteor.publish("singleobject", function(bar) {
return MyCollection.find({foo: bar});
});
这应该会给我集合"MyCollection"的SINGLEONE对象,其中foo属性等于"bar",对吧?(只有一个对象是真的…所以findOne()也应该有效)。相反,它所做的是返回集合中的所有对象,即使是那些foo不等于bar的对象。
它与另一个集合完美配合,在该集合中存在多个foo:"bar"为true的对象。我真的看不出我做错了什么。我可以不订阅只返回一个对象的发布函数吗?
有人对此有什么想法吗?!:-)
致以最良好的问候Patrick
您使用的代码:
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。在publish方法中,如果标志为false,则只需返回null
。
更干净的方法是跟踪您的所有订阅句柄,并对您目前不想使用的句柄调用stop()
。这很好,但很难在这个版本的流星中推荐,因为一切都必须手动完成,这增加了一些不必要的工作。
所以。。。不要放置
Meteor.subscribe()
内部
Meteor.autorun()
或
Deps.autorun()
Meteor.autorun()/Deps.autorun()中的所有内容都始终执行,即使它在特定于模板的.js文件中也是如此。我认为这些js文件中的每一个都是在加载相应的模板时才加载的,这当然是完全错误的。这只是为了正确构建您的应用程序。
因此,如果您想根据加载的模板订阅发布函数,请将Meteor.subscribe放入路由器回调函数中并在那里订阅。
现在非常适合我!:)