1

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

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

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

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

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'
4

1 回答 1

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()在服务器上使用并使用不同的文档进行更新。

于 2015-07-14T15:30:54.577 回答