我正在使用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
没有骰子,它仍未定义。我确定我没有触发反应性的东西,但是我不太确定在这种情况下正确的模式是什么,或者是否有更简洁的方式。
答案 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
。需要两次跳,但工作正常。