路由器waitOn等待每个渲染的订阅

时间:2014-01-22 18:15:07

标签: collections meteor iron-router

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

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

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

2 个答案:

答案 0 :(得分:7)

查看this issue上的最新评论。 Chris解释说,一旦您离开激活它们的路线,您的路由器发起的订阅将被停止。这意味着更改路线会导致您的订阅不断启动和停止,这可以解释您所看到的行为。以下是一些选项:

在路由器

之外开始订阅

将订阅放入路由器可以延迟订阅,直到需要它为止。但是你也要支付在路线运行之前没有数据的惩罚。考虑在路由器之外激活一些订阅,如下所示:

Tracker.autorun(function() {
  if (Meteor.user()) {
    Meteor.subscribe('posts');
  }
});

不要等待订阅

您可以将订阅添加到路由的before挂钩中。请参阅示例here。当您需要数据但无需等待时,您可以获得订阅的好处。缺点是您可能需要在代码中添加一些guards以防止数据未被加载。

使用订阅管理器

请查看subs-manager(文档here)。它是一个旨在帮助解决这个问题的软件包。我们在生产中使用它,它确实有助于增加我们在路线之间的订阅重用。一句忠告 - cacheLimitexpireIn具有相当保守的默认值,因此如果您有很多共享订阅,则应考虑增加这些订阅。

答案 1 :(得分:1)

mizzao 发布了对已接受的答案的替代答案,作为对铁路由器下this issue的评论:

  

只要在路由加载之前命中了订阅,就可以将其传递给路由器等待。我通常把我的所有订阅 - 包括自动运行的和订阅路由器的订阅 - 放到一个文件中,然后让相关的数组等待。即使全局订阅只要存储回文件的闭包中,这也是可以的。