我有一个带有waitOn
钩子的路线,它返回一个Meteor.subscribe
. 每次触发路线时,我都会loadingTemplate
在看到实际数据之前简要地看到我的微调器。
我会以为我只需要等待订阅下载一次,即第一次?
如果我做错了,请提出更好的方法。
我有一个带有waitOn
钩子的路线,它返回一个Meteor.subscribe
. 每次触发路线时,我都会loadingTemplate
在看到实际数据之前简要地看到我的微调器。
我会以为我只需要等待订阅下载一次,即第一次?
如果我做错了,请提出更好的方法。
看看关于这个问题的最后评论。Chris 解释说,一旦您离开激活它们的路由,路由器发起的订阅就会停止。这意味着更改路由会导致您的订阅不断启动和停止,这解释了您所看到的行为。以下是一些选项:
将订阅放入您的路由器具有延迟订阅直到需要时的好处。但是,您还要支付在路线运行之前没有数据的惩罚。考虑在路由器之外激活您的一些订阅,如下所示:
Tracker.autorun(function() {
if (Meteor.user()) {
Meteor.subscribe('posts');
}
});
您可以将您的订阅添加到您的路线before
挂钩。请参阅此处的示例。当您需要数据但不必等待时,您可以获得订阅的好处。不利的一面是,您可能需要在代码中添加一些保护措施,以防止尚未加载的数据。
看看subs-manager(这里的文档)。这是一个包来帮助解决这个确切的问题。我们在生产中使用它,它确实有助于增加我们在路由之间的订阅重用。一个忠告 -cacheLimit
和expireIn
有相当保守的默认值,所以如果你有很多共享订阅,你应该考虑增加这些。
mizzao在 Iron-Router 下发布了对已接受答案的替代答案,作为对此问题的评论:
只要在路由加载之前订阅被击中,您就可以将其传递给路由器等待。我通常把我所有的订阅——包括自动运行的和路由器加载的——放到一个文件中,并给出一系列相关的等待。即使全局订阅发生更改,只要将它们存储回文件的闭包中,这也是可以的。