2013-11-20 62 views
0

問題,所以我在這裏有這樣的代碼進行自動訂閱玩家Deps.autorun與Meteor.user()在Firefox和IE

Deps.autorun -> 
    Meteor.subscribe "game", Meteor.user().profile.game 

當前遊戲,但它僅適用於谷歌瀏覽器。 Firefox和IE都顯示錯誤,表示Meteor.user(...)未定義。

請注意,當我直接在控制檯中鍵入Meteor.user().profile.game時,它會很好地返回當前遊戲ID。顯然,這個問題只是出於某種原因而與上面的代碼。另外,依賴於Session的其他Deps.autorun函數也可以正常工作。 謝謝。

回答

4

這是一種競爭條件。您假設autorun執行時用戶已經登錄。如果他/她不是,則Meteor.user()將返回null。一個解決方案是隻使用一個浸泡:

Tracker.autorun -> 
    Meteor.subscribe 'game', Meteor.user()?.profile.game 

但發佈功能知道哪些用戶試圖訂閱,所以我認爲,一個更好的解決辦法是這樣的:

Tracker.autorun -> 
    if Meteor.user() 
    Meteor.subscribe 'game' 

autorunMeteor.user()的檢查將強制它在用戶登錄時重新運行(這對於性能原因也是有益的)。然後在服務器上,你可以做:

Meteor.publish 'game', -> 
    user = Meteor.users.findOne @userId 
    {game} = user.profile 
    Games.find game 
+0

嗯。實際上聽起來更好更容易。但是我可以知道遊戲之間的花括號是什麼嗎? –

+0

這是[解構賦值](http://coffeescript.org/#destructuring)的一個例子。基本上它是'game = user.profile.game'的簡寫。 –