我有一个发布功能如下:
Meteor.publish('tasks', function (name) {
var project = Projects.findOne({name: name});
return Tasks.find({projectId: project._id});
});
现在假设在某些时候对Projects进行了更改,结果是上面的Projects.findOne
返回了一个不同的项目,因此Tasks.find将返回其他任务。
但是,对项目所做的更改不会重新发布任务
我使用过reactivePublish,但事实证明包有问题(并且没有任何单元测试)。那么,是否有一种简单的方法可以在项目更改时重新发布此发布功能?
答案 0 :(得分:23)
在撰写本文时,反应性连接是一个未解决的问题。有关完整概述,请参阅Reactive Joins In Meteor。
我强烈建议不要直接使用observeChanges。要做到这一点非常困难,而且很容易产生内存泄漏。如果你不相信我,请在EventedMind上观看this video。它会让你的眼睛流血。
此问题有several package-based solutions。 meteor 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
。你不希望这样。