2017-05-08 138 views
1

我正在构建React-Meteor网络应用程序,我需要访问某个集合中的特定数据。流星反应订阅特定的采集数据

有三个主要组件,公司列表,项目列表和任务列表。列出所有公司时,我可以选择一个,然后显示与该公司相关的所有项目。然后,我想要做的是点击一个项目并查看与该项目相关的所有任务。我的数据结构如下(你可以看到,项目对象的数组):

{ 
    "_id" : "aQnrkqMi6ugEvav4a", 
    "owner" : "7Gp49ZCtGC9oEx3jN", 
    "createdAt" : ISODate("2017-05-08T15:52:27.777Z"), 
    "data" : { 
     "name" : "lkhgb", 
     "contacts" : [ 
      { 
      ... 
      } 
     ], 
     "projects" : [ 
      { 
       ... 
      }, 
      { 
       "name" : "ljhvljhvblhkjvblhkj", 
       "id" : "258757206", 
       "tasks" : [ 
        "task1", 
        "task2" 
       ] 
      } 
     ] 
    } 
} 

在我的任务列表组件,我出口它像这样:

export default createContainer((props) => { 
    const {companyId} = props.match.params; 
    Meteor.subscribe('company'); 
    return {project: Company.findOne(companyId)}; 
}, TaskList) 

我在哪里”把公司撤下道具。我也从props中取消了projectId,但是当我查询集合时,它只是返回undefined。我已经发布了GitHub repo在这里住 - https://github.com/GlueDigiStu/ClientManager,并希望得到任何帮助。

回答

0

您确实订阅了服务器上的“公司”发布。 虽然该出版物不存在。

Meteor.publish('company', function (companyId) { 
    const publications = []; 
    publications.push(Company.find(
    { 
     _id: companyId, 
    }, 
)); 
    return publications; 
}); 

这将从服务器发布你想要的ID。 然后从客户的预订将是:

Meteor.subscribe('company', props.companyId); 

让我知道,如果您有任何进一步的问题。

如果我可以,我也会给你一些建议。将文件放入文件中对于出版物并不是很好。 我会建议将项目和任务放入新的集合中,并且只有在他们的项目被选中后才订阅任务。

+0

嗨米奇,感谢你 - 我试过你的初始方法,我似乎无法得到它的工作。至于你的建议,我想我会沿着这条路走下去,并试图将我的一个大集合分成三个独立的集合。尽管如此,我还是无法摆脱“转换”的文档。你对这个话题有什么建议吗?我找到了这一个教程,但它是为铁路路由器,而不是反应(但我想它是相似的)http://meteor.hromnik.com/blog/joins-in-meteorjs-and-mongodb – GlueDigiStu

+0

我不会能够帮助您完成转换和被动连接。我们从来没有在我们的项目中使用它们,因为如果订阅的集合没有仔细管理,并且只是吐出所有属性,就会导致巨大的性能下降。只要小心你使用变换发布的内容。 – mitchken