Meteor.publish:发布取决于其他集合的集合

时间:2014-10-16 07:48:44

标签: javascript meteor meteor-publications

我有一个发布功能如下:

Meteor.publish('tasks', function (name) {
    var project = Projects.findOne({name: name});

    return Tasks.find({projectId: project._id});
});

现在假设在某些时候对Projects进行了更改,结果是上面的Projects.findOne返回了一个不同的项目,因此Tasks.find将返回其他任务。 但是,对项目所做的更改不会重新发布任务

我使用过reactivePublish,但事实证明包有问题(并且没有任何单元测试)。那么,是否有一种简单的方法可以在项目更改时重新发布此发布功能?

2 个答案:

答案 0 :(得分:23)

概述

在撰写本文时,反应性连接是一个未解决的问题。有关完整概述,请参阅Reactive Joins In Meteor

推荐

强烈建议不要直接使用observeChanges。要做到这一点非常困难,而且很容易产生内存泄漏。如果你不相信我,请在EventedMind上观看this video。它会让你的眼睛流血。

此问题有several package-based solutionsmeteor guide建议publish-composite

如果您发现使用基于包的解决方案的想法是不可接受的,请仔细查看Reactive Joins In Meteor中的加入客户端部分。它干净但需要更多用户的等待。如果您希望在模板级别激活订阅,请参阅template joins上的帖子。

答案 1 :(得分:6)

现在街区还有一个新的孩子。完整的server-side reactive publish解决方案。 (免责声明:我是其中一位作者。)它的设计使您可以像autorun一样正常使用它。它会自动处理所有事情。

通过调用meteor add peerlibrary:reactive-publish安装软件包。

添加包后,您只需执行以下操作:

Meteor.publish('tasks', function (name) {
    this.autorun(function (computation) {
        var project = Projects.findOne({name: name}, {fields: {_id: 1}});

        return Tasks.find({projectId: project._id});
    });
});

正如您所期望的那样。 : - )

重要的是将第一个查询中的字段限制为_id,否则每次项目文档的任何字段更改时都会重新运行autorun。你不希望这样。