2015-05-18 80 views
3

我有收集所謂的客房,現在,我想這取決於用戶在哪裏上的應用程序,所以發佈室的不同子集,這是我腦子裏想的:如何使用不同的數據子集發佈相同的集合?

Meteor.publish('roomList', function() { 
    return Rooms.find({}, {fields: {'roomId': 1, 'playerCount': 1, 'isPlaying': 1}}); 
    }); 

    Meteor.publish('roomInfo', function(_id) { 
    return Rooms.find({_id: _id}, {fields: {'players': 1}}); 
    }) 

    Meteor.publish('roomGame', function(_id) { 
    return Rooms.find({_id: _id}, {fields: {'game': 1}}); 
    }) 

我不想當用戶剛剛瀏覽房間時扼殺發送玩家信息的連接,但是,當用戶進入房間時,我想訂閱他到roomInfo,以便他可以看到誰在房間中,當房間正在玩時,訂閱roomGame其中包含遊戲信息。 這是我訂閱的方式(在這一點上,用戶已經訂閱了roomList)。

Router.route('/sala/:_id', { 
    name: 'roomLobby', 
    waitOn: function() { 
     return this.subscribe('roomInfo', this.params._id); 
    }, 
    data:function(){ 
     var r = Rooms.findOne(this.params._id); 
     console.log(r.players); 
     return r; 
    } 
    }); 

但是,r.players總是以未定義的方式出現。

我錯過了什麼?

+0

如果您將'this.subscribe'替換爲'Meteor.subscribe',它會起作用嗎? –

+0

它仍然返回undefined。 –

+0

可能與http://stackoverflow.com/questions/12632452/publishing-subscribeing-multiple-subsets-of-the-same-server-collection/12684186有關 – Poyi

回答

0

您的路線邏輯看起來不錯。我會改變只有幾件事情:

Router.route('/sala/:_id', { 
    name: 'roomLobby', 
    waitOn: function() { 
     return Meteor.subscribe('roomInfo', this.params._id); 
    }, 
    data: function() { 
     if(this.ready()) { 
      var r = Rooms.findOne(this.params._id); 
      console.log(r.players); 
      return r; 
     } 
    } 
}); 

,我改變的第一件事情是在你的waitOn路由選項定義中使用Meteor.subscribe()而不是this.subscribe()。這是按照文檔herewaitOn路徑選項定義中定義訂閱句柄的規定方式。

我改變的第二件事是將所有的代碼都包含在if(this.ready()){}語句中的data路由選項定義中。根據文檔herethis.ready()呼叫直接綁定到路由的等待列表中並作出反應,該路由在您的waitOn路由選項定義中定義一個或多個Meteor.subscribe()調用時填充。

相關問題