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



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

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放入路由器回调函数中并在那里订阅。

现在非常适合我!:)

相关内容

最新更新