【发布时间】:2014-11-25 00:21:53
【问题描述】:
我有一个模板,用户应该能够在该模板中单击一个按钮以调出一个模式,并在该模式中从显示在那里的大约 10,000 个项目的列表中选择少数项目以进行搜索或滚动浏览.
由于这个集合如此之大,我不想在我绝对不需要它时将它留在内存中。
所以我想仅在查看模式时订阅此集合,并且我想确保在未查看模式时取消订阅。
有没有办法明确取消订阅一个集合?
【问题讨论】:
我有一个模板,用户应该能够在该模板中单击一个按钮以调出一个模式,并在该模式中从显示在那里的大约 10,000 个项目的列表中选择少数项目以进行搜索或滚动浏览.
由于这个集合如此之大,我不想在我绝对不需要它时将它留在内存中。
所以我想仅在查看模式时订阅此集合,并且我想确保在未查看模式时取消订阅。
有没有办法明确取消订阅一个集合?
【问题讨论】:
有几种方法可以做到这一点:
subscribe 返回一个可以调用stop 的句柄。例如:
var handle = Meteor.subscribe('stuff');
handle.stop();
因为autorun 会在其反应性依赖项发生变化时自动启动和停止订阅,所以这将起作用:
Tracker.autorun(function () {
if (Session.get('showingModal'))
Meteor.subscribe('stuff');
});
旁注 - 使用方法调用来搜索如此大的数据集而不是将整个数据发布给客户端可能更有意义。例如,您可以在用户查询更改时设置会话变量,然后使用autorun 根据方法的返回值更新结果集。
【讨论】:
https://docs.meteor.com/#/full/meteor_subscribe
引用文档:
Meteor.subscribe 返回一个订阅句柄,它是一个对象 使用以下方法:
stop() 取消订阅。这通常会导致 服务器指示客户端从 客户端的缓存。
所以基本上你需要做的就是将订阅句柄存储在一个变量中,当你不再需要那些已发布的文档时调用stop方法。
请注意,如果您使用iron:router(您可能应该使用),这会在每次更改路线时自动为您处理,这很方便,但有时会引发很多不必要的调用Meteor.publish 调用对于服务器和带宽来说不是微不足道的...要解决这个问题,您可以使用 meteorhacks:subs-manager 但无论如何这是另一个主题。
【讨论】: