Meteor 1.3、ES6、および React でチャット アプリを構築しています。
私は 3 つのコレクションを持っています。2. 会話: 関係者もいます。3. メッセージ: 2 番目のコレクションに関連付ける conversation_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) では、このリアクティブ結合は完全に機能していました。
何が間違っている可能性がありますか?
- publish-composite パッケージは Meteor 1.3 では動作しませんか?
- publish-composite は React-Komposer では使用できませんか?
- 他の方法でそれらを混合する必要がありますか?
- Meteor 1.3 でリアクティブ結合を管理する別のオプション (このパッケージの有無にかかわらず) はありますか?
ありがとう