5

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

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

如果我做错了,请提出更好的方法。

4

2 回答 2

7

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

在路由器之外开始订阅

将订阅放入您的路由器具有延迟订阅直到需要时的好处。但是,您还要支付在路线运行之前没有数据的惩罚。考虑在路由器之外激活您的一些订阅,如下所示:

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

不要等待订阅

您可以将您的订阅添加到您的路线before挂钩。请参阅此处的示例。当您需要数据但不必等待时,您可以获得订阅的好处。不利的一面是,您可能需要在代码中添加一些保护措施,以防止尚未加载的数据。

使用订阅管理器

看看subs-manager这里的文档)。这是一个包来帮助解决这个确切的问题。我们在生产中使用它,它确实有助于增加我们在路由之间的订阅重用。一个忠告 -cacheLimitexpireIn有相当保守的默认值,所以如果你有很多共享订阅,你应该考虑增加这些。

于 2014-01-22T18:57:16.900 回答
1

mizzao在 Iron-Router 下发布了对已接受答案的替代答案,作为对此问题的评论:

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

于 2014-01-26T16:04:25.980 回答