【问题标题】:React and Meteor SubscriptionReact 和 Meteor 订阅
【发布时间】:2016-12-02 16:10:39
【问题描述】:

我不确定这是否是对 React 和 Meteors 连接的限制,因为文档表明它应该可以在没有额外参数的情况下实现。

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

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();
    }
});

现在我在 react 中调用订阅

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 的限制还是我执行错了?

【问题讨论】:

    标签: reactjs meteor


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨杰里米。感谢您提供信息丰富的答案。我现在了解主要问题,问题是必须存在供应商集合的多个订阅(因为您可以在供应商之间切换)。如果您能详细说明或解释Check the state of the client side collection 的含义,我很感兴趣。您的意思是检查客户端集合的计数或查询?
    • 是的,我的意思是您可以在订阅运行之前查看客户端集合。您可以控制台记录 find().fetch() 或 find().count() 以快速查看,或者您可以使用可用于更仔细检查集合的工具之一。我真正喜欢和使用的是github.com/bakery/meteor-devtools - 有些人喜欢使用蒙古语。它们只是让它变得更容易一些,因为您不必在代码或控制台中输入命令。
    • 关于开发工具的好建议。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2017-11-30
    • 2016-03-07
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多