逻辑是点击用户,检查现有房间。如果有,去现有的房间。如果没有,创造新的空间并进入它。用户和我之间只有一个独特的空间。当我第一次点击用户时,它会为房间设置唯一的ID。但是,如果我第二次点击该名称,它会将我引导到一个url params作为用户ID的房间。
想知道什么是错的,如果这是一个更干净的方式。我也无法显示接收器的名称。我使用了助手Meteor.users.findOne({ _id: this.receiver })
。
roomDetail
//subscription
self.subscribe('room', Router.current().params._id);
//.. room helper
return Rooms.findOne({ _id: Router.current().params._id });
用户页面点击按钮
Template.usersShow.events({
'click .user': function(event) {
var receiver = this._id;
if (receiver) {
var res = Rooms.findOne({ 'receiver' : receiver });
if(res){
//..route to the existing room
} else {
//...create new room
答案 0 :(得分:1)
为了确保任何一对用户之间只有一个房间,你应该同时对待"发起人"和#34;接收器"相等。下面我描述一种做到这一点的方法。
一个房间有一个id(内置_id
)和两个用户的ID:
{
userA: "aaaa",
userB: "bbbb",
// ...
}
找到" aaaa"之间的房间。和" bbbb",我们不知道哪个是哪个。我们可以通过强加 userA
具有在userB
之前排序的ID的规则来避免此问题。为了便于使用此规则,我们编写了一个辅助函数:
function userAAndB(user1, user2) {
if (user1 < user2) return {userA: user1, userB: user2};
else return {userA: user2, userB: user1};
}
现在,如果我们想为用户x
和y
找到 会议室,我们可以这样找到:
var theRoom = Rooms.findOne(userAAndB(x, y));
帮助者也可以用作创建新房间的起点。
为了找到用户所在的所有房间,我们可以使用$or
operator:
var allRoomsWithX = Rooms.find({$or: [{userA: x}, {userB: x}]});
使用此设计,您可以通过以下几种方式实现路线和按钮:
将其他用户的ID放在路线中,例如allRooms/:otherUser
。路由器,模板和发布可以使用userAAndB(userId, otherUser)
来查找他们需要的房间。
在这种情况下,如果它不存在,您需要一些创建房间的代码。在服务器上是最好的,所以你可以将它放在发布功能中。这意味着客户不需要知道房间ID,只需链接到正确的路线即可。
将房间ID放在路线中,例如allRooms/:_id
。路由器,模板和出版物可以使用会议室_id
。
在这种情况下,您需要找出给定一对用户的正确房间ID,以便建立链接。使用userAAndB(userId, otherUser)
非常简单。如果不存在,您还需要创建一个新房间。您可以在用户点击链接时执行此操作。
最好制作一个Meteor Method来获取一对用户的房间ID,这样您就不需要将所有房间都发送给客户端。该方法类似getRoomId(user1, user2)
,如果需要,它会创建一个房间,然后返回id。
略有关联,因为您在询问有关构建代码的更好方法,我想提及Iron Router的waitOn
和data
功能。
您可以让Iron Router为您订阅订阅并获取数据,这样您就不需要在模板中执行此操作。如果在主数据加载之前无法合理地呈现模板,那么这很好,并且可能在您的roomDetail
路径中很好。在this section of the Iron Router guide中查找waitOn
和data
作为示例。