如何在访问Meteor网站的不同客户之间共享会话?协作ToDos?

时间:2015-10-13 22:35:29

标签: javascript session meteor collaboration

我正在学习网络开发,最近Meteor引起了我的兴趣。

  1. 我完成了创建待办事项的入门教程,并使用“保存”按钮将列表提交到数据库。它允许每个打开网站的人看到相同的待办事项列表。
  2. 我在待办事项中添加了用户登录系统,以便人们可以登录并只查看自己的待办事项列表。
  3. 现在,我正在努力扩展上面的例子,为Collaborative to-dos。
    这是一个用例示例:
  4. 我的老板登录do.com并开始创建他的待办事项列表。当Boss登录时,我也碰巧从我的笔记本电脑打开do.com,我看到一条消息闪烁​​ - 会话已经打开。你想和Boss合作吗?如果我说'是',Boss会在他的屏幕上被通知允许我访问他的列表,并且在授予访问权限时,我将能够与Boss的待办事项合作,我们在列表中的两个变化反映彼此的屏幕,但最后的保存/提交按钮对我来说仍然是冻结的(因为我后来来了)并且仅对Boss保持活动状态。因此,当Boss点击保存按钮时,列表将通过他和我的更改提交到数据库。
    如果Boss选择不允许我做出贡献,我会看到自己的待办事项。

    另一方面,如果我选择“否”,我会在我的待办事项清单上重新开始,而不会影响其他地方的已开放会议。

    该场景也应该以其他方式工作。如果我是那个在do.com上有活跃会话并且Boss稍后打开自己会话的人,那么他应该知道他是否想和我合作等等。

    在Meteor中实现此功能的最佳方法是什么?我遇到了Persistent Session package这可能是解决方案,但我无法通过消息/通知允许/拒绝其他用户的用例。感谢,对此有任何帮助。我在这里是一个完整的新手,请找任何不必要的措辞的借口,我想很好地解释我的问题。 提前谢谢。

1 个答案:

答案 0 :(得分:3)

Session不是正确的工具,您希望使用服务器db(Collections)来调解此协作。

鉴于您创建了特定于用户的待办事项列表,我将假设您的出版物有点像这样:

Tasks = new Mongo.Collection("tasks");

if (Meteor.isServer) {
  Meteor.publish("tasks", function () {
    return Tasks.find({owner: this.userId});
  });
}

因此,下一步是更改此设置,以便您可以查看自己的任务,以及属于与您共享任务的任何用户的任务。这可以像这样创建:

Tasks = new Mongo.Collection('tasks');
CanView = new Mongo.Collection('canView');

// CanView holds docs with this schema:
//   {
//      user: 'DzxiSdNxEhiHMaoi6',
//      taskLists: ['DzxiSdNxEhiHMaoi6', '7X97ZhPxjX6J4eNWx']
//   }


if (Meteor.isServer) {
  Meteor.publish('tasks', function () {
    var canView = CanView.findOne({user: this.userId}).taskLists;
    return Tasks.find({owner: {$in: canView}});
  });
}

在客户端上,任务可以显示为一个列表,也可以由所有者属性隔离。

如何在CanViews任务列表列表中添加和删除ID将取决于请求访问/提供共享的工作流程等。

您提到的工作流程的另一部分只是Boss能够保存更改,但仍然可以在两个屏幕上进行反应性更新。这将需要更多的工作,因为您需要实现一个两步过程,在服务器上有两个集合。即Boss(任务所有者)保存直接提交给规范Tasks集合,其他用户保存到第二个TaskUpdates集合。两者都发布给客户,然后客户必须以明确且有意义的方式将TaskUpdates的数据覆盖在实际的Tasks上。