Делайте реактивные соединения в Meteor+ReactJS

Боролись с этим очень долго; с моим приложением Meteor+ReactJS я хочу иметь реактивное соединение между MainCollection и SubCollection. И PublishComposite может быть именно тем, что мне нужно. Однако при обновлении SubCollection это не реактивно!

Кто-нибудь знает, как сделать реактивное соединение на стороне сервера с помощью метеора + реакция?

код сервера

import { publishComposite } from 'meteor/reywood:publish-composite';
Meteor.MainCollection('maincollection.pub.all', {
  find: function () {
    return MainCollection.find();
  },
  children: [
    {
      find: function (doc) {
        return SubCollection.find(
          { mainCollectionId: doc._id },
          {
            sort: { createdAt: -1 }, limit: 1,
            fields: {
              completedAt: 1,
              mainCollectionId: 1,
            }
          })
      }
    }
  ]
});

клиентский контейнер

export default createContainer(() => {
  let mainCollectionSub = Meteor.subscribe('maincollection.pub.all');
  options = {
    transform: function (doc) {
      doc.subcollection = SubCollection.findOne({
        mainCollectionId: doc._id }, ).fetch();
      return doc;
    }
  }
    var maincollection = MainCollection.find({}, options).fetch();
  return {
    maincollection: MainCollection.find({}, options).fetch(),
  }
}, MainCollectionView);

person Joost Döbken    schedule 04.04.2017    source источник


Ответы (1)


В вашем примере SubCollection.findOne() не является реактивным до того, как он будет использован внутри обработчика transform, а не в первом аргументе createContainer. Попробуй это:

export default createContainer(() => {
  let mainCollectionSub = Meteor.subscribe('maincollection.pub.all');
  options = {
    transform: function (doc) {
      doc.getSubCollection = function () {
        return SubCollection.findOne({
          mainCollectionId: this._id,
        });
      };
      return doc;
    }
  }
  return {
    maincollection: MainCollection.find({}, options).fetch(),
    subcollections: SubCollection.find().fetch(),
  };
}, MainCollectionView);

Затем вы можете вызвать doc.getSubCollection(), который является реактивным источником данных для связанной подколлекции.

person Marcin Hagmajer    schedule 29.05.2017