反应和流星订阅

问题描述:

我不确定这是否是对React和Meteors连接的限制,因为文档建议它应该可能没有额外的参数。反应和流星订阅

当我在响应中调用流星订阅时,如果我没有在查询中明确声明参数,它将返回任何数据,忽略publish函数中的指定数据。

Meteor.publish("supplier", function() { 
    if(this.userId) { 

     var user = Meteor.users.findOne(this.userId, { fields : { active : 1 }}); 
     if(user.active != this.userId || user.active != undefined){ 

     // This only returns 1 singular supplier - is correct 
     var supplier = Supplier.find({ _id : user.active, users : this.userId }); 
     return supplier; 

     } else { 
     return this.ready(); 
     } 
    } else { 
     return this.ready(); 
    } 
}); 

现在我所说的认购反应,如使

getMeteorData: function() { 

    var data = {} 

    handle = Meteor.subscribe("supplier"); 

    if(handle.ready()) { 
     data.supplier = Supplier.findOne(); // Returns Wrong supplier 
     //data.supplier = Supplier.findOne({_id: session.get("active")}) // Returns correct supplier 
     data.supplierReady = true 
    } 

    return data; 

    }, 

这将返回第一供应商集合中没有一个记录在服务器上的发布功能!但是,如果我明确地通过{ _id : user.active}它的作品!

现在我的理解是,通过执行publish函数中的服务器上的逻辑,我可以简单地使用Supplier.findOne(),但事实并非如此,我不明白为什么。这是对React/Meteor的限制还是我实施这个错误?

这不是一个特定于反应的问题,它是findOne工作方式的结果。如果您的客户端Supplier集合中包含一个或多个文档,则Supplier.findOne()只会抓取第一条可用的记录,而不参考刚刚从订阅中获取的文档。

这意味着:(a)由于其他预先订阅,您在客户端有多个供应商可用;或者(b)您从handle订阅返回多个供应商。

检查订阅handle之前的客户端集合的状态。如果有一个或多个文档,那是您的应用程序的预期状态,那么修改客户端findOne以像以前一样添加{_id: user.active}

+0

嗨,杰里米。感谢您提供丰富的答案。我现在了解委托人,问题是多个订阅供应商集合必须存在(如您可以在供应商之间切换)。如果您能够通过'检查客户端收集的状态'来阐述或解释您的意思,我很感兴趣。你的意思只是一个计数或查询来检查客户端集合? – Allreadyhome

+1

是的,我的意思是您可以在订阅运行之前查看客户端集合。你可以通过console.log find().fetch()或find()。count()来快速查看,或者你可以使用其中一个可用的工具来更仔细地检查集合。我真正喜欢和使用的是https://github.com/bakery/meteor-devtools-有些人喜欢使用蒙古语。因为您不必在代码或控制台中输入命令,所以它们使它变得更容易一些。 –

+0

关于开发工具的好建议。谢谢! – Allreadyhome