什么是拥有独特用户空间的更好方法

时间:2016-03-16 04:57:19

标签: javascript meteor

逻辑是点击用户,检查现有房间。如果有,去现有的房间。如果没有,创造新的空间并进入它。用户和我之间只有一个独特的空间。当我第一次点击用户时,它会为房间设置唯一的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   

1 个答案:

答案 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};
}

现在,如果我们想为用户xy找到 会议室,我们可以这样找到:

var theRoom = Rooms.findOne(userAAndB(x, y));

帮助者也可以用作创建新房间的起点。

为了找到用户所在的所有房间,我们可以使用$or operator

var allRoomsWithX = Rooms.find({$or: [{userA: x}, {userB: x}]});

使用此设计,您可以通过以下几种方式实现路线和按钮:

  1. 将其他用户的ID放在路线中,例如allRooms/:otherUser。路由器,模板和发布可以使用userAAndB(userId, otherUser)来查找他们需要的房间。

    在这种情况下,如果它不存在,您需要一些创建房间的代码。在服务器上是最好的,所以你可以将它放在发布功能中。这意味着客户不需要知道房间ID,只需链接到正确的路线即可。

  2. 将房间ID放在路线中,例如allRooms/:_id。路由器,模板和出版物可以使用会议室_id

    在这种情况下,您需要找出给定一对用户的正确房间ID,以便建立链接。使用userAAndB(userId, otherUser)非常简单。如果不存在,您还需要创建一个新房间。您可以在用户点击链接时执行此操作。

    最好制作一个Meteor Method来获取一对用户的房间ID,这样您就不需要将所有房间都发送给客户端。该方法类似getRoomId(user1, user2),如果需要,它会创建一个房间,然后返回id。

  3. 略有关联,因为您在询问有关构建代码的更好方法,我想提及Iron Router的waitOndata功能。

    您可以让Iron Router为您订阅订阅并获取数据,这样您就不需要在模板中执行此操作。如果在主数据加载之前无法合理地呈现模板,那么这很好,并且可能在您的roomDetail路径中很好。在this section of the Iron Router guide中查找waitOndata作为示例。