如何发布包含不同数据子集的同一集合?
How can I publish the same collection with different subsets of data?
我有一个名为 Rooms 的集合,现在,我想根据用户在应用程序中的位置发布不同的 Room 子集,所以,这就是我的想法:
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;
}
}
});
我更改的第一件事是在 waitOn
路由选项定义中使用 Meteor.subscribe()
而不是 this.subscribe()
。这是根据文档 here.
在 waitOn
路由选项定义中定义订阅句柄的规定方法
我更改的第二件事是将所有代码包装在 data
路由选项定义中的 if(this.ready()){}
语句中。根据文档 here,this.ready()
呼叫直接绑定到路由的等待列表中并对其做出反应,当您在 [=13= 中定义一个或多个 Meteor.subscribe()
呼叫时,该列表将被填充] 路由选项定义。
我有一个名为 Rooms 的集合,现在,我想根据用户在应用程序中的位置发布不同的 Room 子集,所以,这就是我的想法:
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;
}
}
});
我更改的第一件事是在 waitOn
路由选项定义中使用 Meteor.subscribe()
而不是 this.subscribe()
。这是根据文档 here.
waitOn
路由选项定义中定义订阅句柄的规定方法
我更改的第二件事是将所有代码包装在 data
路由选项定义中的 if(this.ready()){}
语句中。根据文档 here,this.ready()
呼叫直接绑定到路由的等待列表中并对其做出反应,当您在 [=13= 中定义一个或多个 Meteor.subscribe()
呼叫时,该列表将被填充] 路由选项定义。