【发布时间】:2015-04-14 20:47:47
【问题描述】:
我有一个基于服务器端用户权限的发布。我希望它对这些权限的更改做出反应。
// SERVER CODE
Meteor.publish("my_publication", function(parent_id) {
//fetch our parent record and lookup this user's permissions
var parent = ParentCollection.findOne({_id: parent_id});
var myPermissionsList = parent.permissionsDict[this.userId];
//use these permissions to make our query
ChildCollection.find({parent_id: parent_id, permissions: {$in: myPermissionsList}})
}
// CLIENT CODE
Tracker.autorun(function () {
Meteor.subscribe('my_publication', Session.get("my_parent_id"));
});
这会正确返回指定父级的“子”集合的所有元素,只要父级说用户至少拥有子元素列表中的一项权限。 它在用户实际上不知道他们的权限是什么的情况下执行此操作,这是一项要求。
这就像在 Meteor 中所期望的那样:
- 如果任何返回的 ChildCollection 元素发生更改,订阅确实会自动更新。
- 如果客户端更改“my_parent_id”会话变量,订阅确实会自动更新,从而触发 Tracker.autorun 重新订阅。
- 如果用于进行查询的权限 (parent.permissionsDict[this.userId]) 发生更改,订阅不会自动更新。
我们正在寻找在最后一种情况下获得自动更新的最佳(最高性能)方法。
这篇文章是有关该主题的有用且更详细的资源: https://www.discovermeteor.com/blog/reactive-joins-in-meteor/
我目前的理解是,我需要利用 cursor.observeChanges() 来对权限查询中的更改做出反应。但是,我不确定这如何适合 Meteor 发布/订阅模型的其余部分——我将在哪里调用它,以及回调如何指示 Meteor 重新发布 "my_publication"?
我相信https://atmospherejs.com/mrt/reactive-publish 解决了这个问题,但我觉得在转向外部软件包之前,我应该尝试更好地掌握流星的核心反应性。我对性能成本也缺乏了解。
任何帮助将不胜感激!
【问题讨论】:
标签: meteor