我有一个名为“房间”的集合,现在,我想根据用户在应用程序上的位置来发布“房间”的不同子集,因此,我想到的是:

  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总是出现未定义状态。

我想念什么?

最佳答案

您的路线逻辑看起来不错。我只会更改几件事:

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


我更改的第一件事是在Meteor.subscribe()路由选项定义中使用this.subscribe()而不是waitOn。这是根据文档herewaitOn路由选项定义中定义订阅句柄的规定方法。

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

10-06 07:38