如何在运行时决定客户端将订阅哪个Meteor集合

时间:2015-07-14 14:42:19

标签: javascript dynamic meteor ddp

我正在编写一个Web应用程序,它将动态检查DDP服务器的集合(出版物)。我遇到的一个问题是,一旦创建了一个Meteor集合,它就会在应用程序的生命周期内坚持下去:

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

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

由于客户端不知道要订阅哪些收藏,因此问题更加严重。我认为这会导致模板助手的设置方式出现问题。到目前为止,我见过的所有示例都显示帮助者只返回特定集合的结果,例如:

return foo.find();

我仍然关注反应模型是如何运作的,但我猜我是否会重新分配foo:

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

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

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

  1. 我的客户端应用程序事先并不了解服务器的出版物
  2. 服务器对客户端应用程序一无所知
  3. 应用程序必须动态发现出版物(这些出版物存储在应用程序将订阅的“根”集合中)
  4. 除了Meteor服务器之外,我正在使用DDP.connect连接到我们自己的DDP服务器
  5. 我正在开发的应用程序就像PHP / Django管理员,但是对于我们自己的平台(cortex)。

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

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

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

1 个答案:

答案 0 :(得分:1)

我相信你对这些条款有点挣扎。

作为示例,您可以使用此MeteorPad关于FlowRouter和基于路由的订阅。

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

至少快速回答你的问题:

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

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

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

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

5.。)您可以使用其他参数订阅您的发布方法,以便只请求和交换少量文档。

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

您应该阅读有关meteorhacks子管理器包的信息,这会减少数据/集合交换的数量并加快您的应用程序。

你从sascha greif找到一篇关于发布订阅meteor的好文章。

我希望这个资源能引导你做出正确的决定。

取得成功 汤姆

更新:

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

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

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