我使用React和Meteor。我使用withTracker将数据传递给我的Event React组件,该组件从URL获取ID:
export default withTracker(props => {
let eventsSub = Meteor.subscribe('events');
return {
event: Events.find({ _id: props.match.params.event }).fetch(),
};
})(Event);
这是有效的,但我现在需要从另一个名为Groups的集合中获取数据。困难的是,我需要从我已经返回的事件中获取一个ID。
下面的代码在我硬编码时起作用1.但是1实际上是动态的,需要来自事件查询的字段返回。
export default withTracker(props => {
let eventsSub = Meteor.subscribe('events');
let groupsSub = Meteor.subscribe('groups');
return {
event: Events.find({ _id: props.match.params.event }).fetch(),
group: Groups.find({ id: 1 }).fetch(),
};
})(Event);
答案 0 :(得分:3)
@ Yasser的回答看起来应该有效,虽然在event
未定义时会出错(例如,当事件订阅仍在加载时)。
如果您知道自己在寻找单个文档,则可以使用.findone()
代替.find().fetch()
。此外,当您按_id
搜索时,您可以直接将其用作第一个参数。您还应该为withTracker()
提供任何订阅的loading
状态:
export default withTracker(props => {
const eventsSub = Meteor.subscribe('events');
const groupsSub = Meteor.subscribe('groups');
const loading = !(eventsSub.ready() && groupsSub.ready());
const event = Events.findOne(props.match.params.event);
const group = event ? Groups.findOne(event.id) : undefined;
return {
loading,
event,
group,
};
})(Event);
性能pov还有另一个问题。您的两个订阅没有任何参数;他们可能会返回比您真正需要的更多文档,导致这些订阅加载速度变慢。我会将event
参数传递给一个发布,然后该发布将返回一个包含事件和组的数组。
export default withTracker(props => {
const oneEventSub = Meteor.subscribe('oneEventAndMatchingGroup',props.match.params.event);
const loading = !oneEventSub.ready();
const event = Events.findOne(props.match.params.event);
const group = event ? Groups.findOne(event.id) : undefined;
return {
loading,
event,
group,
};
})(Event);
服务器上的oneEventAndMatchingGroup
发布:
Meteor.publish(`oneEventAndMatchingGroup`,function(id){
check(id,String);
const e = Events.findOne(id);
return [ Events.find(id), Groups.find(e.id) ];
});
请注意,发布必须返回游标或游标数组,因此在此处使用.find()
。
答案 1 :(得分:1)
不清楚event
对象的哪个字段应该提供给Groups.find
。但我会尝试回答这个问题。
尝试使用类似的东西 -
export default withTracker(props => {
let eventsSub = Meteor.subscribe('events');
let groupsSub = Meteor.subscribe('groups');
event = Events.find({ _id: props.match.params.event }).fetch();
return {
event,
group: Groups.find({ id: event['id'] }).fetch(),
};
})(Event);
请注意这一行 -
group: Groups.find({ id: event['id'] }).fetch(),
可以修改为使用您需要的任何字段。
group: Groups.find({ id: event['whichever field'] }).fetch(),