2017-07-15 7 views
0

私はMeteorとReactを勉強しています。ユーザーがメッセージを作成できる小さなアプリケーションを作成しています。かなり簡単です...しかし、私は結合コレクションを取り除くことはできません。MeteorとReactを使ってコレクションを再生しようとしています

messages.js:

import { Meteor } from 'meteor/meteor'; 
import { publishComposite } from 'meteor/reywood:publish-composite'; 

export const Messages = new Mongo.Collection('messages'); 

if (Meteor.isServer) { 
    publishComposite('messages', { 
    find() { 
     return Messages.find({}, { 
     sort: { createdAt: -1 } 
     }); 
    }, 
    children: [ 
     { 
     find(message) { 
      return Meteor.users.find(
      { _id: message._author } 
     ); 
     } 
     } 
    ] 
    }); 
} 

何を私が使用していることはここで

は、これまでのコードです...汚い仕事をして私を助けるために publish-compositeですが、私は迷ってしまいましたのドキュメントで

componentDidMount() { 
    this.messagesTracker = Tracker.autorun(() => { 
     Meteor.subscribe('messages'); 
     const messages = Messages.find({}, { 
     sort: { createdAt: -1 } 
     }).fetch(); 
     console.log(messages); 
     this.setState({ messages }); 
    }); 
    } 

そして、私の中のリアクトコンポーネントは、私はこれを作成しましたパブリッシュ-複合私はそれがデータをフェッチするために、私が反応して同じことをエミュレートする方法がわからないTemplate.topTenPosts.helpersを使っ見る...

ログのショーは、任意のユーザー情報なしに単にメッセージデータである何:

Object 
createdAt:Sat Jul 15 2017 18:17:13 GMT+0200 (CEST) 
message:"A message..." 
_author:"6M8wNbt4Ff2YTN99u" 
_id:"2gL2xKbWnduYqTHXk" 

どうすれば削除できますか?歓声

答えて

0

publish-compositeはtrueを返しません - 複数のコレクションからすべての関連ドキュメントを返します。それでもクライアント側で関連情報を表示する必要があります。あなたの場合、メッセージを表示していますが、の著者の情報も表示する必要があります。あなたのReactコンポーネントは、それぞれのドキュメントを表示するには両方のコレクションにアクセスする必要があります。

でスタート:

componentDidMount() { 
    this.messagesTracker = Tracker.autorun(() => { 
    Meteor.subscribe('messages'); 
     const messages = Messages.find({}, { 
     sort: { createdAt: -1 } 
     }).fetch(); 
     const authors = Authors.find({}).fetch; 
     this.setState({ messages, authors }); 
    }); 
    } 

今、あなたのコンポーネントが、その状態でメッセージや(関連)著者の両方にアクセスすることができます。レンダリングコードを表示すると、この回答をレイアウトに組み込む方法を補うことができます。

+0

あなたの答えをありがとう。このアプローチに従うと、私は著者についての「人口」の情報を含むコレクションを受け取ることはできませんが、各メッセージの作者の正しい名前を取得するために著者を繰り返してやる必要があります。実際に私は期待通りにうまく動作するかどうかを確認するために[perak:joins](https://atmospherejs.com/perak/joins)を試しています。あなたのアプローチを試してみましょう。ありがとう。 –

+0

あなたはそうです - それは伝統的な参加をしません、それはすべての必要なデータがクライアントで終わることを確認します。それはあなたのレンダリングで一緒に引っ張っていくことです。 –

0

ソリューション

messages.js:

perak:joinsが、私はそれが正常に動作し、非常に使いやすいです取得するために使用されるパッケージです

[...] 
export const Messages = new Mongo.Collection('messages'); 

Messages.join(Meteor.users, '_author', 'author', ['profile']); 

if (Meteor.isServer) { 
    Meteor.publish('messages', function() { 
    return Messages.find({}, { 
     sort: { createdAt: -1 } 
    }); 
    }); 
} 
[...] 

componentDidMountは何も変化がありませんmessagesの結果は、profileオブジェクトで埋められたauthorという新しいフィールドで予想されるものです。

関連する問題