我正在用 Meteor 1.3、ES6 和 React 构建一个聊天应用程序。
我有 3 个集合: 1. 人物:谁有一系列与此人相关的对话。2. 对话:也有参与的人。3. 消息:有一个与第二个集合相关的对话 ID 字段。
所以我使用reywood:publish-composite包来管理反应连接:
- => 获取此人(用户)的对话
- => 获取该用户所有对话的消息
- => 根据选择的对话过滤消息(反应状态)
我也在使用Kadira 的 React-Komposer包。
这是我的代码:
// publications.js
Meteor.publishComposite('compositeChat', function (people_id) {
return {
find() {
return Collections.People.find({_id: people_id});
},
children: [
{
find(people) {
return Collections.Conversations.find(
{_id: {$in: people.conversations }},
{sort: {'lastMessage.date': -1}}
);
}
},
{
find(people) {
return Collections.Messages.find(
{conversation_id: {$in: people.conversations }},
{sort: {date: 1}}
);
}
},
{
find(people) {
return Collections.People.find(
{_id: {$in: people.contacts }}
);
}
}
]
};
});
// AppContainer.js
import {composeAll, composeWithTracker} from 'react-komposer';
import AppWrapper from '../AppWrapper.jsx';
import * as Collections from '../../../../lib/collections/collections.js';
function composeChat(props, onData) {
let user;
if (!Meteor.userId()) {
user = 'qXSWv64qKaEPAu5yp';
} else {
user = Meteor.userId();
//console.log('Meteor.userId()', Meteor.userId());
}
const
chatSub = Meteor.subscribe('compositeChat', user);
if (chatSub.ready()) {
const chatData = {
chatLoading:
!chatSub.ready(),
myUserData:
Collections.People.findOne({_id: user}),
myContacts:
Collections.People.find(
{_id: { $ne: user}}, { sort: { name: 1 } }
).fetch(),
myConversations:
Collections.Conversations.find(
{}, { sort: { date: -1 } }
).fetch(),
noConversationContacts:
(function () {
return myFunctions.chat.noConversationContacts(
Collections.People.find(
{_id: { $ne: user}}
).fetch(),
Collections.Conversations.find().fetch()
);
}()),
myMessages:
Collections.Messages.find(
{}, {sort: {'lastMessage.date': -1}}
).fetch(),
myOtherPeople:
(function () {
return myFunctions.chat.getTheOtherPeople(
Collections.Conversations.find().fetch(),
user
);
}()),
unreaded:
(function () {
return myFunctions.chat.countUnreadedMessages(
user,
Collections.Conversations.find().fetch(),
Collections.Messages.find().fetch()
);
}())
};
console.log('chatData', chatData);
onData(null, {chatData});
}
}
export default composeWithTracker(composeChat)(AppWrapper);
问题是:添加新消息时,我没有在 UI 中获得更新,但数据在那里(在 Mongo 中),所以如果我刷新页面,我会收到新消息......
在我以前的应用程序版本(Meteor 1.2)中,这种反应式连接工作得很好。
有什么问题?
- 发布复合包是否不适用于 Meteor 1.3?
- 发布复合不能与 React-Komposer 一起使用吗?
- 我必须以其他方式混合它们吗?
- 在 Meteor 1.3 中是否有另一种选择(有或没有这个包)来管理反应连接?
谢谢