【问题标题】:Meteor: Publish function returns whole collection instead of one objectMeteor:发布函数返回整个集合而不是一个对象
【发布时间】:2013-08-04 03:10:18
【问题描述】:

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

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

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

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

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

最好的问候 帕特里克

【问题讨论】:

    标签: javascript meteor publish-subscribe


    【解决方案1】:

    你使用过的代码:

    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 @HubertOG 目前拥有 1337 声望,所以你一定要听他的。
    • 感谢@HubertOG!所以问题是我在 Meteor.autorun() 中订阅了我现在想的不正确的。所以...尝试将订阅函数放入 Template.templatename.created = function() {} 但由于某种原因仍然不正确。通过标准的 a href 链接(--> 加载另一个模板)切换到另一个页面后,之前模板的旧订阅仍然完好无损。那么如果我希望订阅是特定于模板的,我应该把订阅放在哪里?
    • Few Meteor 版本之前 Meteor.autorun() 已被 Deps.autorun() 取代 - 请参阅更新后的答案。
    • 还是同样的问题。更改页面后,它仍然没有“取消订阅”我的订阅。
    • 知道了!请看下面的答案!谢谢你的帮助!!
    【解决方案2】:

    所以...不要放

    Meteor.subscribe()
    

    里面

    Meteor.autorun()
    

    Deps.autorun()
    

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

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

    现在非常适合我! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2019-06-20
      • 2015-11-26
      • 1970-01-01
      • 2021-08-12
      • 2011-11-13
      • 1970-01-01
      相关资源
      最近更新 更多