【问题标题】:Meteor.publish: publish collection which depends on other collectionMeteor.publish:发布依赖于其他集合的集合
【发布时间】:2014-10-16 07:48:43
【问题描述】:

我有一个发布功能如下:

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

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

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

我使用了响应式发布,但结果证明包有问题(并且也没有任何单元测试)。那么,有没有一种简单的方法可以让这个发布功能在项目发生变化时重新发布?

【问题讨论】:

标签: javascript meteor meteor-publications


【解决方案1】:

概述

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

建议

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

这个问题有several package-based solutionsmeteor guide 推荐publish-composite

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

【讨论】:

  • 可用软件包的问题是它们有问题或没有文档(更不用说单元测试)。所以在这成为流星的一部分之前,我会在客户端上修复它。谢谢!
  • Reactive Joins in Meteor 文章中的代码似乎随着 Iron-router API 的更改而变得陈旧。有什么方法可以让我们获得适用于当前版本的代码 sn-p?
  • 是的,我一直想更新这个答案。谢谢丹。
【解决方案2】:

现在街区里有一个新孩子。完整的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。你不想这样。

【讨论】:

  • 非常感谢分享!
  • 对我不起作用,也许它在 Meteor 1.3 中被删除了
  • 你必须使用上面链接的包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2015-04-06
  • 2013-02-07
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多