【发布时间】:2014-02-12 23:20:33
【问题描述】:
我有一个带有waitOn 钩子的路由,它返回一个Meteor.subscribe。每次触发路线时,我都会在看到实际数据之前短暂地从我的loadingTemplate 看到微调器。
我还以为我只需要等待订阅下载一次,也就是第一次?
如果我做错了,请提出更好的方法。
【问题讨论】:
标签: collections meteor iron-router
我有一个带有waitOn 钩子的路由,它返回一个Meteor.subscribe。每次触发路线时,我都会在看到实际数据之前短暂地从我的loadingTemplate 看到微调器。
我还以为我只需要等待订阅下载一次,也就是第一次?
如果我做错了,请提出更好的方法。
【问题讨论】:
标签: collections meteor iron-router
查看this issue 上的最后一个 cmets。 Chris 解释说,一旦您离开激活它们的路由,路由器发起的订阅就会停止。这意味着更改路由会导致您的订阅不断启动和停止,这解释了您所看到的行为。以下是一些选项:
将订阅放入您的路由器的好处是可以将订阅延迟到需要时。但是,您还要支付在路线运行之前没有数据的惩罚。考虑在路由器之外激活您的一些订阅,如下所示:
Tracker.autorun(function() {
if (Meteor.user()) {
Meteor.subscribe('posts');
}
});
您可以将订阅添加到路由的 before 挂钩。请参阅示例here。当您需要数据但不必等待时,您可以获得订阅的好处。缺点是您可能需要在代码中添加一些 guards 以防止您的数据尚未加载。
查看subs-manager(文档here)。这是一个包来帮助解决这个确切的问题。我们在生产中使用它,它确实有助于增加我们在路由之间的订阅重用。一个忠告 - cacheLimit 和 expireIn 有相当保守的默认值,所以如果你有很多共享订阅,你应该考虑增加这些。
【讨论】:
loadingTemplate(因为这是您首先要避免的)。相反,要进行防御性编程(参见上面的“守卫”链接)并假设数据可能不存在。
mizzao 在 Iron-Router 下对 this issue 发表了评论:
只要在路由加载之前订阅被命中,你就可以将它传递给路由器等待。我通常把我所有的订阅——包括自动运行的和路由器加载的——放到一个文件中,并给出一系列相关的等待。即使全局订阅发生更改,只要将它们存储回文件的闭包中,这也是可以的。
【讨论】: