2017-07-15 75 views
0

我正在学习流星和反应,我正在创建一个小应用程序,允许用户创建消息。很容易......但我无法摆脱加入收藏。试图使用流星和反应收集使用

什么我使用的是publish-composite帮我做肮脏的工作,但我迷路了......

这是迄今为止代码:

messages.js:

import { Meteor } from 'meteor/meteor'; 
import { publishComposite } from 'meteor/reywood:publish-composite'; 

export const Messages = new Mongo.Collection('messages'); 

if (Meteor.isServer) { 
    publishComposite('messages', { 
    find() { 
     return Messages.find({}, { 
     sort: { createdAt: -1 } 
     }); 
    }, 
    children: [ 
     { 
     find(message) { 
      return Meteor.users.find(
      { _id: message._author } 
     ); 
     } 
     } 
    ] 
    }); 
} 

并在我的阵营组件我创造了这个:

componentDidMount() { 
    this.messagesTracker = Tracker.autorun(() => { 
     Meteor.subscribe('messages'); 
     const messages = Messages.find({}, { 
     sort: { createdAt: -1 } 
     }).fetch(); 
     console.log(messages); 
     this.setState({ messages }); 
    }); 
    } 

在文档发布复合我看到它使用Template.topTenPosts.helpers来获取数据,我不知道如何模拟与之反应一样...

什么日志显示只是没有任何用户信息的消息数据:

Object 
createdAt:Sat Jul 15 2017 18:17:13 GMT+0200 (CEST) 
message:"A message..." 
_author:"6M8wNbt4Ff2YTN99u" 
_id:"2gL2xKbWnduYqTHXk" 

我该如何摆脱它?欢呼声

回答

0

发布复合不会真的加入 - 它会返回多个集合中的所有相关文档。您仍然需要在客户端显示相关信息。在您的情况下,您正在显示消息但您还需要显示作者的信息。您的React组件必须访问两个集合以显示来自每个集合的文档。

开始:

componentDidMount() { 
    this.messagesTracker = Tracker.autorun(() => { 
    Meteor.subscribe('messages'); 
     const messages = Messages.find({}, { 
     sort: { createdAt: -1 } 
     }).fetch(); 
     const authors = Authors.find({}).fetch; 
     this.setState({ messages, authors }); 
    }); 
    } 

现在您的组件可以同时访问的消息,并在其状态(相关)的作者。如果你显示你的渲染代码,那么我可以通过如何将这些代码放在你的布局中来增加这个答案。

+0

感谢您的回答。遵循这种方法,我没有收到关于作者的“填充”信息的集合,但是我仍然需要遍历作者才能为每封邮件获取作者的正确名称。其实我正在尝试[霹雳:加入](https://atmospherejs.com/perak/joins),看看它是否能像我期望的那样好。如果我会尝试你的方法。谢谢。 –

+0

你是对的 - 它不会做传统的加入,它只是确保所有需要的数据都在客户端上结束。然后由您在渲染中将其拉到一起。 –

0

解决方案

perak:joins是我用得到它正常工作的包,这是非常容易使用:

messages.js:

[...] 
export const Messages = new Mongo.Collection('messages'); 

Messages.join(Meteor.users, '_author', 'author', ['profile']); 

if (Meteor.isServer) { 
    Meteor.publish('messages', function() { 
    return Messages.find({}, { 
     sort: { createdAt: -1 } 
    }); 
    }); 
} 
[...] 

componentDidMount没有变化并且messages的结果是由profile对象填充的名为author的新字段的预期结果。