从1st withTracker查询获取ID并传递给第二个withTracker查询? (流星/反应)

时间:2017-12-01 08:09:18

标签: reactjs meteor

我使用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);

2 个答案:

答案 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(),