Collections 路由器waitOn在每次渲染时等待订阅

Collections 路由器waitOn在每次渲染时等待订阅,collections,meteor,iron-router,Collections,Meteor,Iron Router,我有一个带有waitOn钩子的路由,它返回Meteor.subscribe。每次触发路由时,我都会在查看实际数据之前短暂地从我的loadingTemplate中看到微调器 我本以为我只需等待订阅下载一次,即第一次 如果我做错了,请建议一个更好的方法。看看上一篇评论。Chris解释说,一旦你离开激活它们的路由,路由器发起的订阅就会停止。这意味着更改路由会导致订阅不断启动和停止,这解释了您看到的行为。以下是一些选项: 在路由器外部启动订阅 将订阅放入路由器的好处是将订阅延迟到需要时。但是,您还需要支

我有一个带有
waitOn
钩子的路由,它返回
Meteor.subscribe
。每次触发路由时,我都会在查看实际数据之前短暂地从我的
loadingTemplate
中看到微调器

我本以为我只需等待订阅下载一次,即第一次


如果我做错了,请建议一个更好的方法。

看看上一篇评论。Chris解释说,一旦你离开激活它们的路由,路由器发起的订阅就会停止。这意味着更改路由会导致订阅不断启动和停止,这解释了您看到的行为。以下是一些选项:

在路由器外部启动订阅 将订阅放入路由器的好处是将订阅延迟到需要时。但是,您还需要支付在路由运行之前没有数据的罚款。考虑激活路由器之外的某些订阅,如:

Tracker.autorun(函数(){
if(Meteor.user()){
Meteor.订阅(“帖子”);
}
});
不要等待订阅 您可以在hook之前将订阅添加到路线的
。参见示例。当您需要数据但不必等待时,您可以获得订阅的好处。缺点是您可能需要在代码中添加一些内容,以防止数据尚未加载

使用订阅管理器
查看(文档)。这是一个帮助解决这个问题的软件包。我们在生产中使用它,它确实有助于增加路由之间的订阅重用。一个建议-代码> > CaleLime[/Cuff]和<代码> ExpReIn < /代码>有相当保守的缺省值,因此如果您有很多共享订阅,您应该考虑增加这些。

< P>一个可接受的答案由<强> MIZAZ作为对Iron Router的评论:

只要在路由加载之前点击订阅,就可以将其传递给路由器等待。我通常将所有订阅(包括自动运行订阅和路由器加载订阅)放在一个文件中,并给出相关订阅的数组以供等待。即使全局订阅发生更改,只要它们存储回文件的闭包中,这也是可以的


谢谢你的回答,尤其是铁路由器问题的链接。如果我在waitOn钩子外部(即全局)创建订阅,如何确保在订阅完成第一次加载之前调用路由的情况下显示loadingTemplate?我建议您在这种情况下不要显示
loadingTemplate
(因为这是您一开始试图避免的)。相反,要防御性地编程(见上面的“警卫”链接),并假设数据可能不在那里。这很公平。另一个有用的答案是关于铁路由器的问题。用它更新了你的答案。谢谢。编辑在我看之前就被拒绝了。也许只是把这个链接发布在一个推荐的网站上,这样其他人就可以看到它了。我已经把它作为一个新的答案发布了。再次感谢。