2017-07-15 74 views
0

我正在學習流星和反應,我正在創建一個小應用程序,允許用戶創建消息。很容易......但我無法擺脫加入收藏。試圖使用流星和反應收集使用

什麼我使用的是publish-composite幫我做骯髒的工作,但我迷路了......

這是迄今爲止代碼:

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 } 
     ); 
     } 
     } 
    ] 
    }); 
} 

並在我的陣營組件我創造了這個:

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

發佈複合不會真的加入 - 它會返回多個集合中的所有相關文檔。您仍然需要在客戶端顯示相關信息。在您的情況下,您正在顯示消息但您還需要顯示作者的信息。您的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

感謝您的回答。遵循這種方法,我沒有收到關於作者的「填充」信息的集合,但是我仍然需要遍歷作者才能爲每封郵件獲取作者的正確名稱。其實我正在嘗試[霹靂:加入](https://atmospherejs.com/perak/joins),看看它是否能像我期望的那樣好。如果我會嘗試你的方法。謝謝。 –

+0

你是對的 - 它不會做傳統的加入,它只是確保所有需要的數據都在客戶端上結束。然後由您在渲染中將其拉到一起。 –

0

解決方案

perak:joins是我用得到它正常工作的包,這是非常容易使用:

messages.js:

[...] 
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的新字段的預期結果。