【问题标题】:How can I make a Meteor publish method reactive to a server-side parameter?如何使 Meteor 发布方法对服务器端参数产生反应?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2015-04-28
    相关资源
    最近更新 更多