我正在研究Meteor和React,我正在创建一个允许用户创建消息的小应用程序。很简单...但我无法摆脱加入集合。
我正在使用的是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 }
);
}
}
]
});
}
在我的React组件中,我创建了这个:
componentDidMount() {
this.messagesTracker = Tracker.autorun(() => {
Meteor.subscribe('messages');
const messages = Messages.find({}, {
sort: { createdAt: -1 }
}).fetch();
console.log(messages);
this.setState({ messages });
});
}
在publish-composite的文档中,我看到它使用Template.topTenPosts.helpers
来获取数据,我不知道如何使用React来模拟它...
日志显示的只是没有任何用户信息的消息数据:
Object
createdAt:Sat Jul 15 2017 18:17:13 GMT+0200 (CEST)
message:"A message..."
_author:"6M8wNbt4Ff2YTN99u"
_id:"2gL2xKbWnduYqTHXk"
我该怎样摆脱它?干杯
答案 0 :(得分:0)
publish-composite不会执行真正的 join - 它会返回多个集合中的所有相关文档。您仍需要在客户端显示相关信息。在您的情况下,您正在显示消息,但您还需要显示作者信息。您的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 });
});
}
现在,您的组件可以访问其状态中的消息和(相关)作者。如果你展示你的渲染代码,那么我可以通过如何将各个部分放在你的布局中来增加这个答案。
答案 1 :(得分: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
的结果是author
对象填充的名为profile
的新字段所期望的结果。