2017-02-09 7 views
0

Meteor(1.4.2.3)とReactを使用して、Objectsのコレクションがあり、コレクションItemsを参照するitemIdがあります。Meteor Reactがマージしたコレクションを公開

現在、私は、クライアント側のコレクションを購読する:

export default createContainer(() => { 
    let objectsSub = Meteor.subscribe('allObjects'); 
    var objects = Objects.find({}, { 
     transform: function (doc) { 
     doc.item = Items.findOne({ 
      _id: doc.itemId 
     }); 
     return doc; 
     } 
    }).fetch(); 
    return { 
    objects: objects, 
    } 
}, App); 

これは完璧に動作しますが、私はサーバー側のコレクションをマージするよりエレガントだと思います。しかし、私が見つけた解決策のどれもが

は、コレクション定義で変換動作するようには思えない

コンソールができます:

Error: transform must return object

で公開Transformを

if (Meteor.isServer) { 
    Meteor.publish('allObjects', function() { 
    return Objects.find({}, { 
     sort: { startedAt: -1 }, 
     transform: function (doc) { 
     doc.item = Items.findOne({ 
      _id: doc.itemId 
     }); 
     return doc; 
     } 
    }); 
    }); 
}; 

TypeError: Cannot read property 'name' of undefined

どこnameは、私は通常、このように公開でそれを行うItems

+1

はhttps://github.com/englue/meteor-publish-compositeを見てください – chazsolo

+0

@chazsolo:私は試みましたが、子供たちは購読されたコレクションを持っていません。私はこれが実行中の問題だと思う:https://github.com/englue/meteor-publish-composite/issues/67 – API

答えて

0

の財産である:

Meteor.publish('allObjects', function() { 
    let cursor = Objects.find({}, { 
     sort: { startedAt: -1 }); 
    }); 

    let transformData = (fields) => { 
     fields.item = Items.findOne({ 
      _id: fields.itemId 
     }); 

     return fields; 
    }; 

    let handle = cursor.observeChanges({ 
     added: (id, fields) => { 
      fields = transformData(fields); 
      this.added('objects', id, fields); 
     }, 
     changed: (id, fields) => { 
      fields = transformData(fields); 
      this.changed('objects', id, fields); 
     }, 
     removed: (id) => { 
      this.removed('objects', id); 
     } 
    }); 

    this.ready(); 

    this.onStop(() => { 
     handle.stop(); 
    }); 
    } 
関連する問題