拥有独特的用户房间的更好方法是什么
Whats a better way to have unique user rooms
逻辑是单击用户,检查现有房间。如果有,请转到现有房间。如果没有,则创建新房间并进入其中。用户和我之间只会有一个独特的房间。当我第一次单击用户时,它会为房间设置一个唯一的 ID。但是,如果我第二次单击该名称,它会将我路由到一个带有 url 参数作为用户 ID 的房间。
想知道出了什么问题,是否有更清洁的方法。我也无法显示接收器的名称。我用了帮手Meteor.users.findOne({ _id: this.receiver })
.
房间详情
//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
为了确保任何一对用户之间只有一个房间,您应该平等对待"发起者"和"接收者"。下面我将描述一种方法。
房间有一个 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
运算符:
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 方法来获取一对用户的房间 ID,这样你就不需要将所有房间都发送给客户端。该方法类似于
getRoomId(user1, user2)
,如果需要,它会创建一个房间,然后返回 id。
稍微相关,因为您正在询问更好的代码结构方法,我想提到Iron Router的waitOn
和data
功能。
您可以让Iron Router为您进行订阅和获取数据,这样您就不需要在模板中进行。如果在加载主数据之前无法合理地呈现模板,这将非常有用,并且在您的roomDetail
路由中可能很好。例如,在铁路由器指南的这一部分中查找waitOn
和data
。
- 在JavaScript中拆分日期字符串的更好方法是什么
- 设置嵌套对象属性的更好方法
- 用Javascript重新格式化复杂文本日期字符串的更好方法
- 什么'这是从第三个函数上的async 1st函数获得结果的更好方法
- 将数组从javascript格式化为php的更好方法,反之亦然
- jquery:将动画绑定到滚动条位置的更好方法
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 编写if-else语句的更好方法
- 传递promise回调方法的更好方法
- 在Knockoutjs中设置计算对象的observableArray的更好方法
- 从网页获取数据的更好方法,而不是使用DOM和HTML元素
- Backbone js代码气味-嵌入子视图的更好方法
- 从数组中删除项的更好方法
- 对多维数组进行分组的更好方法
- 在node.js和express中基于路径运行不同数据库查询的更好方法
- 动态更改测试中代码覆盖率的require语句的更好方法
- 设计具有数据持久性的web应用程序的更好方法
- 选择表行的更好方法
- 在nodejs服务器上提供文件的更好方法,而不是if/else
- Javascript;Ajax——填充对象的更好方法