2

Meteor 1.3、ES6、および React でチャット アプリを構築しています。

私は 3 つのコレクションを持っています。2. 会話: 関係者もいます。3. メッセージ: 2 番目のコレクションに関連付ける conversation_id フィールドがあります。

そこで、リアクティブ結合を管理するためにreywood:publish-compositeパッケージを使用しています。

  1. => この人 (ユーザー) の会話を取得
  2. => このユーザーのすべての会話のメッセージを取得します
  3. =>選択した会話に応じてメッセージをフィルタリングします(反応状態)

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) では、このリアクティブ結合は完全に機能していました。

何が間違っている可能性がありますか?

  1. publish-composite パッケージは Meteor 1.3 では動作しませんか?
  2. publish-composite は React-Komposer では使用できませんか?
  3. 他の方法でそれらを混合する必要がありますか?
  4. Meteor 1.3 でリアクティブ結合を管理する別のオプション (このパッケージの有無にかかわらず) はありますか?

ありがとう

4

0 に答える 0