17

我有一个发布功能如下:

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

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

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

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

4

2 回答 2

23

概述

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

建议

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

几个基于包的解决方案可以解决这个问题。流星指南推荐publish -composite

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

于 2014-10-17T08:54:25.783 回答
6

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

于 2015-10-03T08:58:15.000 回答