Meteor.publish:发布collections取决于其他collections

我有一个发布function如下:

Meteor.publish('tasks', function (name) { var project = Projects.findOne({name: name}); return Tasks.find({projectId: project._id}); }); 

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

我使用了reactivePublish,但事实certificate这个包有问题(也没有任何unit testing)。 那么,有没有一种简单的方法可以在项目更改时重新发布这个发布function呢?

概观

在撰写本文时,被动连接是一个未解决的问题。 有关完整的概述,请参阅“ meteor中的react native连接” 。

build议

强烈build议不要直接使用observeChanges 。 难以想象,很容易发生内存泄漏。 如果你不相信我,请在EventedMind上观看此video 。 这会让你的眼睛stream血。

有几个基于软件包的解决scheme来解决这个问题。 meteor指南推荐发布 – 复合 。

如果您发现使用基于软件包的解决scheme的想法是不可接受的,请仔细查看来自Reactive Joins In In Meteor中的“ join客户端”部分。 这是干净的,但需要更多的等待用户的一部分。 另外,如果您希望在模板级别激活您的订阅,请参阅我在模板连接上的文章。

现在有一个新的孩子。 完整的服务器端被动式发布解决scheme。 (免责声明:我是其中一位作者。)它的devise使您可以像使用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运行。 你不希望出现这种情况。