2013-07-31 60 views
1

我正在基於流星和MeteorStreams的簡單應用程序。 目的是簡單: 一個用戶會點擊一個按鈕來創建房間其他 用戶將加入房間 這些用戶可以用簡單的消息 發射流中的創建者將監聽到該消息,然後顯示這些流星流:客戶端不接收流

實際上:發送來自其他用戶的消息(登錄服務器腳本),但創建者不會收到它們。 如果我重新加載創建者的頁面,那麼它會從其他用戶發送消息。

我不明白爲什麼它第一次不起作用。

我使用meteor-router作爲我的路由系統。 代碼可以在這裏

https://github.com/Rebolon/MeetingTimeCost/tree/feature/pokerVoteProtection

看到了客戶端代碼在客戶端/視圖/撲克/ *和客戶端/傭工 服務器流的代碼是在服務器/ pokerStreams是availabel。 js

應用程序可以在這裏測試:http://meetingtimecost.meteor.com 創建者必須被記錄。

如果您有任何想法,歡迎任何幫助。 謝謝

回答

2

好吧,好的, 做了一些調試之後,我現在明白了我的代碼有什麼問題: 其實很簡單。問題來自於我忘記將Stream.on事件綁定到Deps.autorun。 結果是這部分代碼不是由反應性管理的,所以當Session改變時它不會自動重新運行。

該解決方案是很容易與流星:只是包裝的Deps.autorun

Meteor.startup(function() { 
    Deps.autorun(function funcReloadStreamListeningOnNewRoom() { 
    PokerStream.on(Session.get('currentRoom') + ':currentRoom:vote', function (vote) { 
     var voteFound = 0; 
     // update is now allowed 
     if (Session.get('pokerVoteStatus') === 'voting') { 
     voteFound = Vote.find({subscriptionId: this.subscriptionId}); 
     if (!voteFound.count()) { 
      Vote.insert({value: vote, userId: this.userId, subscriptionId: this.subscriptionId}); 
     } else { 
      Vote.update({_id: voteFound._id}, {$set: {value: vote}}); 
     } 
     } 
    }); 
    }); 
}); 

內的這部分代碼所以它不是一個流星羣的問題,而只是我的錯。 希望它能幫助人們理解在Template和Collection之外,如果你想要反應性,你需要將你的代碼包裝在Deps中。

+0

你應該接受你自己的答案,因爲它是正確的。 – foobarbecue