【问题标题】:How to decide at runtime for which Meteor collection a client will subscribe如何在运行时决定客户端将订阅哪个 Meteor 集合
【发布时间】:2015-10-03 06:43:53
【问题描述】:

我正在编写一个 Web 应用程序,它将动态检查 DDP 服务器的集合(发布)。我遇到的一个问题是,一旦创建了 Meteor 集合,它就会在应用程序的整个生命周期内一直存在:

foo = new Meteor.Collection("foo");

但是,根据用户对应用程序的操作,我可能不再对 foo.h 感兴趣。让这个集合徘徊会很浪费,因为我最终可能会将整个数据库存储在客户端上。

由于客户端不知道它将订阅哪些集合,问题变得更糟。我认为这会导致模板助手的设置方式出现问题。到目前为止,我看到的所有示例都显示助手只返回特定集合的结果,例如:

return foo.find();

我仍然对反应式模型的工作原理有所了解,但我猜如果我要重新分配 foo:

foo = new Meteor.Collection("bar");

...上面的帮助代码不会神奇地更新以返回“bar”的内容。


更新: 由于建议围绕使用订阅和单个集合的组合,我想我会给出一些背景信息来说明我为什么要问这个问题:

  1. 我的客户端应用程序事先对服务器的发布一无所知
  2. 服务器对客户端应用一无所知
  3. 应用程序必须动态发现发布(这些发布存储在应用将订阅的“根”集合中)
  4. 除了 Meteor 服务器之外,我还使用 DDP.connect 连接到我们自己的 DDP 服务器

我正在开发的应用程序类似于 PHP/Django admin,但用于我们自己的平台(皮质)。

我可以向服务器添加功能,通过单个发布公开整个数据库,并使用订阅参数来确定发布应该转发哪些集合。

但在更改订阅时,这会变成一场噩梦。取消订阅不会清除客户端 minimongo 集合,因此会留下先前订阅的剩余数据。客户端将负责删除订阅之间的数据:

foo_sub.stop();
foo.remove({});
bar_sub = remote.subscribe('bar'); // Assuming 'bar' publishes in 'foo'

【问题讨论】:

  • 你用什么做路由器?
  • 我没有使用路由器(至少不是有意识的)。
  • 另一位用户在下面提供了一个有用的答案。我问你是否使用路由器的原因是你可以根据你当前使用的路由来定义你的订阅。就像您可以根据登录的用户定义订阅一样。
  • @thatgibbyguy 谢谢,但是我需要即时创建和删除 Meteor 集合。我想创建一个通用 Web 应用程序,可以监视任何(皮质)DDP 服务器的集合。这意味着我不知道我可以期待哪些系列。

标签: javascript dynamic meteor ddp


【解决方案1】:

我相信你在条款上有点挣扎。

作为一个例子,你可以使用这个 MeteorPad 关于 FlowRouter 和基于路由的订阅。

http://meteorpad.com/pad/Ba5DTe94NjFi3ZTPA/Playground_Flow-Router_Chat

至少可以快速回答您的问题:

1.) 没有订阅的集合(您必须从项目中删除自动发布)在客户端是空的

2.) Collection 只定义一个文档结构

3.) 根据您的项目,如果您有不同的文档模型(如 sql 中的表),您将使用多个集合

4.) 您应该进行基于模板或路由的订阅 - 最好不要在应用程序范围内。

5.) 您可以为您的发布方法订阅附加参数,以便只请求和交换少数文档。

6.) 您可以在客户端使用 Col.find(),例如,如果您的发布只是发送最后 5 个文档。

您应该阅读有关 meteorhacks subs-manager 包的信息,这可以减少数据/收集交换的数量并加快您的应用程序。

您可以从 sascha greif 找到一篇关于发布订阅流星的优秀在线文章。

我希望此资源将指导您做出正确的决定。

取得成功 汤姆


更新:

您可以查看这个 MeteorPad 以查看编写您自己的发布方法并将任何您喜欢的内容推送到客户端的选项。这也可能取决于通过提交发送的参数。

http://meteorpad.com/pad/Zq4QdMW84rKGersFH/Sample_Publish_to_Local-Collection_Reactive_way

假设您不需要return Col.find(),您也可以在服务器上使用Col.find() 并使用不同的文档进行更新。

【讨论】:

  • 谢谢汤姆。我可以看到路由将如何帮助我在现有集合上创建条件订阅。但是,我的应用程序需要动态发现集合。您可以将该应用程序与 phpAdmin 站点进行比较。
  • 问题是关于你的数据模型。集合不像数据库中的游标,它可以处理一次“SELECT * FROM A”和下一次“SELECT * FROM B”。您可以完全更改内容,而不是切换文档(表格)。因此,您可以编写自己的发布者,第一次将 DOCTYPES A 推送到集合中,下一次推送 DOCTYPES B。因此,您保留一个集合,但编写自己的发布者。请参阅我添加的第二个流星垫链接。汤姆
  • 该代码很有帮助,尽管它不适合我的解决方案。我的应用程序连接到不知道我的应用程序的辅助 DDP 源。因此,我无法将特定于应用程序的发布添加到服务器代码中。我真的需要从客户端集合到服务器发布的 1-1 映射,并且客户端必须能够动态发现这些发布。
  • 好的,但在这种情况下,我建议您更改问题并寻找一些 DDP 资源。这是一个很棒的介绍:meteorhacks.com/introduction-to-ddp - 检查 ddp 分析器以检查交换的消息。汤姆
  • 感谢您的链接。我实现了自己的 DDP 服务器 (www.github.com/cortexlang/web),并且知道 DDP 交换的消息。协议不是问题。问题在于客户端 API,它不允许我即时创建/删除集合。
猜你喜欢
  • 2012-08-26
  • 1970-01-01
  • 2015-10-11
  • 2017-02-14
  • 2016-08-13
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多