Meteor.publish: 发布依赖于其他集合的集合

IT技术 javascript meteor meteor-publications
2021-02-10 06:35:17

我有一个发布功能如下:

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

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

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

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

2个回答

概述

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

建议

强烈建议不要直接使用observeChanges很难做到正确,而且很容易发生内存泄漏。如果您不相信我,请在 EventedMind 上观看此视频它会让你的眼睛流血。

几个基于包的解决方案可以解决这个问题。流星指南建议发布复合

如果您发现使用基于包的解决方案的想法是不可接受的,请仔细查看Reactive Joins In Meteor中的 Joining On The Client部分它很干净,但需要用户更多的等待。如果您更喜欢在模板级别激活订阅,另请参阅我关于模板连接的帖子

是的,我一直想更新这个答案。谢谢丹。
2021-03-16 06:35:17
Reactive Joins in Meteor 文章中的代码似乎随着 Iron-router 的 API 的变化而变得陈旧。有什么方法可以让我们得到一个适用于当前版本的代码片段?
2021-03-24 06:35:17
可用包的问题在于它们有问题或没有文档(更不用说单元测试了)。所以直到这是流星的一部分,我才会在客户端上修复它。谢谢!
2021-04-05 06:35:17

现在街区有一个新孩子。一个完整的服务器端react式发布解决方案。(免责声明:我是作者之一。)它的设计使您可以像使用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每次项目文档的任何字段更改时都会重新运行。你不希望出现这种情况。

对我不起作用,也许它在 Meteor 1.3 中被删除了
2021-03-30 06:35:17
您必须使用上面链接的包。
2021-04-10 06:35:17
非常感谢分享!
2021-04-11 06:35:17