2

我正在用 Meteor 1.3、ES6 和 React 构建一个聊天应用程序。

我有 3 个集合: 1. 人物:谁有一系列与此人相关的对话。2. 对话:也有参与的人。3. 消息:有一个与第二个集合相关的对话 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. 发布复合包是否不适用于 Meteor 1.3?
  2. 发布复合不能与 React-Komposer 一起使用吗?
  3. 我必须以其他方式混合它们吗?
  4. 在 Meteor 1.3 中是否有另一种选择(有或没有这个包)来管理反应连接?

谢谢

4

0 回答 0