在观察者中发布其他游标

时间:2015-12-11 16:31:13

标签: javascript meteor

我有一个看起来像这样的文件。

{
  _id: ObjectId,
  orders: [ObjectId, ObjectId]
}

查找这些订单会产生类似这样的内容

{
  _id: ObjectId,
  products: [ObjectId, ObjectId, ObjectId]
}

现在我的出版物将找到并观察父Meteor.users

Meteor.publish(function () {
  let handle = Meteor.users.find(this.userId).observe({
    added: doc => {
      // publish all orders
      // publish all products within that order
    },
    changed: doc => { /** same as above */ }
  });
  this.ready();
  this.onStop(() => handle.stop());
});

当其中任何一个发生变化时,我想修改顶级文档并发布它。也就是说:

this.changed('user', doc._id, publishRelations(doc));

这可能与流星有关吗?

1 个答案:

答案 0 :(得分:0)

您应该可以使用peerlibrary:reactive-publish执行此操作。您只需将要发布的游标包装在发布中的自动运行中。它应该在任何一个反应依赖项(在这种情况下,三个游标)发生变化时重新运行:

Meteor.publish("userOrders", function() {
   var self = this;
   self.autorun(function() {
      var productIds = [];

      // get logged in user
      var userCursor = Meteor.users.find(self.userId);

      //  get orders belonging to logged in user
      var ordersCursor = Orders.find({userId: self.userId});


      // create array of product Ids from user's orders  
      // You could probably make this better by omitting duplicates  
      ordersCursor.forEach(function(doc, index) {
        _.each(doc.products, function(productId) {
           productIds.push(productId);
         });
      });

      // get products in array
      var productsCursor = Products.find({ _id: { $in : productIds } });

      // return array of cursors
      return [
         userCursor,
         ordersCursor,
         productsCursor
      ];

   });

});