如何使Meteor发布方法对服务器端参数起反应?

时间:2015-02-13 18:06:27

标签: meteor

我有一个基于服务器端用户权限的发布。我希望它能够对这些权限的变化做出反应。

// 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中的预期相似:

  • 如果更改了任何返回的 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解决了这个问题,但我觉得在转向外部包装之前,我应该尝试更好地掌握流星的核心反应性。我也对绩效成本缺乏了解。

非常感谢任何帮助!

1 个答案:

答案 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会在文档中的任何字段更改时重新运行,即使您不关心/使用该字段。