“链接”流星订阅

时间:2017-03-03 03:29:01

标签: reactjs meteor meteor-react

我正在使用React和createContainer。我正在寻找一种可以连接两个电话的方式。

例如,如果我有这些数据:

// Category
{
   _id: 'ABC',
   name: 'Cat 1'
}

// Item
{
   catId: 'ABC',
   slug: 'slug'
}

在我的createContainer中,我希望通过它的slug(Item)获取Items.find({ slug })。然后我想转身并通过item.catId获取类别。

我尝试过类似的东西,但它不起作用:

 createContainer(({ slug }) => {
     const itemHandler = Meteor.subscribe('Item.bySlug', slug);
     const item = Items.findOne();

     const categoryHandler = Meteor.subscribe('Category.byId', (item.id || {}).id); // also tried just item.id and got undefined for item
     const category = Categories.findOne();

     return { item, category };
 }, Component);

我可以item很好,但category没有骰子,它仍未定义。我确定我没有触发反应性的东西,但是我不太确定在这种情况下正确的模式是什么,或者是否有更简洁的方式。

3 个答案:

答案 0 :(得分:3)

解决您问题的最简单方法是从服务器端array返回cursors publication,并在collection.findOne()之后在客户端调用subscription

出版物代码将是这样的:

Meteor.publish("your.publication.name", function(slug, id){
    let itemCursor = Items.find(your_selector);
    let categoryCursor = Categories.find(your_selector);
  return [itemCursor, categoryCursor];
});

现在,您将从客户端的Item和Category集合中获取必要的文档。

答案 1 :(得分:0)

您实际上是在进行客户端加入。在这些情况下,我通常会进行服务器端连接。在这里,在Item.bySlug发布者中,我会做这样的事情:

let itemCursor = Items.find({slug: slug});

let transformItem = (fields) => {
    // making an assumption here that Item has a categoryId that indicates its category
    let category = Categories.findOne(fields.categoryId);

    // attach the category to the Item
    fields.category = category;

    return fields;
};

let handle = itemCursor.observeChanges({
    added: (id, fields) => {
        fields = transformItem(fields);
        this.added('items', id, fields);
    },
    changed: (id, fields) => {
        fields = transformItem(fields);
        this.changed('items', id, fields);
    },
    removed: (id) => {
        this.removed('items', id);
    }
});

this.ready();

this.onStop(() => {
    handle.stop();
});

现在,在客户端上,您只需订阅所需的项目,并附上其类别。

答案 2 :(得分:0)

事实证明,我发布的代码确实有用,我只是遇到了Items.categoryId没有正确填充的数据问题。

在这个特定的例子中,我确实想要进行客户端连接,而我所做的工作确实有效。项目位是反应,一旦加载,它实际上会重新运行,然后正确填充该字段。

createContainer(({ slug }) => {
     const itemHandler = Meteor.subscribe('Item.bySlug', slug);
     const item = Items.findOne();

     const categoryHandler = Meteor.subscribe('Category.byId', (item.id || {}).id); // also tried just item.id and got undefined for item
     const category = Categories.findOne();

     return { item, category };
 }, Component);

第一次浏览,item将被定义,category将为空。接下来(只要item准备就绪)将填充category。需要两次跳,但工作正常。