我有一个基于服务器端用户权限的发布。我希望它能够对这些权限的变化做出反应。
// 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"));
});
这将正确地返回" child"的所有元素。集合指定的父级,只要父级表示用户至少具有子元素列表中的一个权限。 如果用户不知道他们的权限是什么,这是一项要求,就会这样做。
这与Meteor中的预期相似:
我们正在寻找在最后一种情况下获得自动更新的最佳(最高性能)方式。
这篇文章是关于该主题的有用的,更详细的资源: https://www.discovermeteor.com/blog/reactive-joins-in-meteor/
我目前的理解是我需要利用 cursor.observeChanges()来响应我的权限查询中的更改。但是,我不确定这是如何适应Meteor发布/订阅模型的其余部分 - 我会在哪里调用它,以及回调如何指示Meteor重新发布" my_publication"
我相信https://atmospherejs.com/mrt/reactive-publish解决了这个问题,但我觉得在转向外部包装之前,我应该尝试更好地掌握流星的核心反应性。我也对绩效成本缺乏了解。
非常感谢任何帮助!
答案 0 :(得分:0)
您可以使用reactive-publish包(我是作者之一):
Meteor.publish("my_publication", function(parent_id) {
this.autorun(function (computation) {
//fetch our parent record and lookup this user's permissions
var parent = ParentCollection.findOne({_id: parent_id}, {fields: {permissionsDict: 1}});
var myPermissionsList = parent.permissionsDict[this.userId];
//use these permissions to make our query
return ChildCollection.find({parent_id: parent._id, permissions: {$in: myPermissionsList}});
});
}
限制您对父文档感兴趣的字段非常重要,否则autorun
会在文档中的任何字段更改时重新运行,即使您不关心/使用该字段。