我正在学习网络开发,最近Meteor引起了我的兴趣。
我的老板登录do.com并开始创建他的待办事项列表。当Boss登录时,我也碰巧从我的笔记本电脑打开do.com,我看到一条消息闪烁 - 会话已经打开。你想和Boss合作吗?如果我说'是',Boss会在他的屏幕上被通知允许我访问他的列表,并且在授予访问权限时,我将能够与Boss的待办事项合作,我们在列表中的两个变化反映彼此的屏幕,但最后的保存/提交按钮对我来说仍然是冻结的(因为我后来来了)并且仅对Boss保持活动状态。因此,当Boss点击保存按钮时,列表将通过他和我的更改提交到数据库。
如果Boss选择不允许我做出贡献,我会看到自己的待办事项。
另一方面,如果我选择“否”,我会在我的待办事项清单上重新开始,而不会影响其他地方的已开放会议。
该场景也应该以其他方式工作。如果我是那个在do.com上有活跃会话并且Boss稍后打开自己会话的人,那么他应该知道他是否想和我合作等等。
在Meteor中实现此功能的最佳方法是什么?我遇到了Persistent Session package这可能是解决方案,但我无法通过消息/通知允许/拒绝其他用户的用例。感谢,对此有任何帮助。我在这里是一个完整的新手,请找任何不必要的措辞的借口,我想很好地解释我的问题。 提前谢谢。
答案 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
上。