Javascript 如何发布具有不同数据子集的同一集合?

Javascript 如何发布具有不同数据子集的同一集合?,javascript,meteor,iron-router,Javascript,Meteor,Iron Router,我有一个名为Rooms的集合,现在,我想根据用户在应用程序上的位置发布Rooms的不同子集,所以,这就是我的想法: Meteor.publish('roomList', function() { return Rooms.find({}, {fields: {'roomId': 1, 'playerCount': 1, 'isPlaying': 1}}); }); Meteor.publish('roomInfo', function(_id) { return R

我有一个名为Rooms的集合,现在,我想根据用户在应用程序上的位置发布Rooms的不同子集,所以,这就是我的想法:

  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)

然而,r.players总是被认为是未定义的


我错过了什么?

你的路线逻辑看起来不错。我只想改变几件事:

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()
。这是根据文档在
waitOn
路由选项定义中定义订阅句柄的指定方法


我更改的第二件事是在
if(this.ready()){}
语句中将所有代码包装在
data
路由选项定义中。根据文档,
this.ready()
调用直接绑定到路由的等待列表中并对其作出反应,当您定义一个或多个
Meteor.subscribe()时,等待列表将被填充
在您的
waitOn
路由选项定义中调用。

如果将
此项替换为
Meteor.subscribe
,是否有效。subscribe
?它仍然返回未定义。可能与
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;
        }
    }
});