【问题标题】:Router waitOn waits on subscription on every render路由器 waitOn 等待每次渲染的订阅
【发布时间】:2014-02-12 23:20:33
【问题描述】:

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

我还以为我只需要等待订阅下载一次,也就是第一次?

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

【问题讨论】:

    标签: collections meteor iron-router


    【解决方案1】:

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

    在路由器外开始订阅

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

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

    不要等待订阅

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

    使用订阅管理器

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

    【讨论】:

    • 感谢您的回答,尤其是 Iron-Router 问题的链接。如果我在 waitOn 挂钩(即全局)之外创建订阅,我如何确保显示 loadingTemplate,以防在订阅完成第一次加载之前调用路由?
    • 我建议您在这种情况下不要显示您的loadingTemplate(因为这是您首先要避免的)。相反,要进行防御性编程(参见上面的“守卫”链接)并假设数据可能不存在。
    • 很公平。 Iron-Router 问题发布了另一个有用的答案。用它更新了你的答案。谢谢。
    • 编辑在我看之前被拒绝了。也许只是在推荐中发布链接,以便其他人可以看到它。
    • 我已将此作为新答案发布。再次感谢。
    【解决方案2】:

    mizzao 在 Iron-Router 下对 this issue 发表了评论:

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

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 1970-01-01
      • 2014-10-09
      • 2023-03-12
      • 1970-01-01
      • 2019-04-25
      • 2020-12-24
      • 2021-05-06
      • 1970-01-01
      相关资源
      最近更新 更多