在流星收集加载时显示加载器

Posted

技术标签:

【中文标题】在流星收集加载时显示加载器【英文标题】:Displaying loader while meteor collection loads 【发布时间】:2012-10-04 11:46:34 【问题描述】:

我有一个模板,task_list,看起来像这样:

#each tasks
    > task
/each

Template.task_list.tasks 返回一个集合,在 ui 中,加载似乎需要一些时间。

在加载集合时,我想显示一个加载指示器。

关于我如何能够做到这一点的任何想法?

顺便说一句,我确实在 task_list 模板上尝试了模板的 rendered 事件,但是它在实际加载列表之前被触发。我还尝试在task 模板上使用rendered,但它似乎永远不会被调用。

【问题讨论】:

我在How can the delay before displaying meteor collections be best addressed?想知道同样的问题 【参考方案1】:

Meteor 1.0.4 更新:现在template-level subscriptions 可用,并且是使用 Iron:router 或独立订阅的首选模式,

有一个补充函数 Template.instance().subscriptionsReady() 当所有使用 this.subscribe 调用的订阅都准备好时返回 true。

在模板的 html 中,您可以使用内置帮助程序 Template.subscriptionsReady,这是一种简单的模式,可以在模板依赖于从订阅加载的数据时在模板中显示加载指示器。

例子:

Template.notifications.onCreated(function () 
  // Use this.subscribe inside onCreated callback
  this.subscribe("notifications");
);
<template name="notifications">
  #if Template.subscriptionsReady
    <!-- This is displayed when all data is ready. -->
    #each notifications
      > notification
    /each
  else
    Loading...
  /if
</template>

这比为整个页面使用通用加载模板要好,因为加载部分已本地化为页面中实际包含新数据的部分。


Pre-Meteor 1.0.4

这个想法是将一个 onReady 函数传递给Meteor.subscribe

Meteor.subscribe('tasks', function onReady() 
  Session.set('tasksLoaded', true);
);

然后,使您的模板依赖于tasksLoaded 会话变量。在客户端 javascript 中:

Template.task_list.helpers(
  tasksLoaded: function () 
    return Session.get('tasksLoaded');
  
);

在您的模板中:

<template name="task_list">
  #if tasksLoaded
    #each tasks
      > task
    /each
  else
    <img src="http://viewvc.svn.mozilla.org/vc/addons/trunk/bandwagon/skin/images/spinner.gif?revision=18591&view=co&pathrev=18591">
  /if

更新:使用iron-router,您可以直接选择指定loading 模板,该模板将在订阅加载时显示。

【讨论】:

谢谢,丹。这是正确的。 这个功能很好,但是当所有订阅都准备好后如何进行回调? 相关问题:除了正在加载的主页上的iron-router 样式加载器外,我还想在我的导航栏中添加一个迷你加载器。我的header 模板中有没有办法以某种方式检查页面上我的模板的 rest 是否已准备就绪?我能想出的只是如何等待加载器实际所在的 that 模板——加载速度非常快。我尝试使用绝对定位 CSS 将我的迷你加载器从我的 iron-router 加载器“放入”导航栏中,但它在某些页面和过渡上变得混乱。将它实际放在我的标题中将是理想的。 如果我通过 Iron:router 使用订阅,该怎么做?我在多条路线上重复使用组件,而每条路线都加载不同的数据。因此,在我的用例中订阅路由器对我来说很有意义。【参考方案2】:

同时发布了一些不错的软件包。看看这两个:

    Spin - 显示一个纺车。使用 Iron Router,您可以指定显示旋转轮的加载模板。 Iron Router Progress - 在页面顶部显示进度条(Youtube 风格)

它们都开箱即用,查看他们的文档以了解更多高级选项。

【讨论】:

这些包确实派上用场了。与此同时,Meteor 发布了 v1.0.4,它引入了模板级订阅和 Template.subscriptionsReady 助手。有关详细信息,请参阅my answer。【参考方案3】:

Dan's 的回答肯定是正确的,但我想提醒一下,我相信 autopublish 包必须被删除才能真正起作用。

meteor remove autopublish

另外,我推荐spin package 一个漂亮的微调器。

【讨论】:

以上是关于在流星收集加载时显示加载器的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 集体中提交表单时显示加载器

获取预加载器以在按钮单击时显示

如何在 Flutter 中获取当前位置时显示加载微调器?

JavaScript 在页面卸载时显示预加载器消息

在等待在 ReactJS 渲染中获取数据时显示加载微调器

当页面数据未从 Firebase 完全加载时显示加载指示器/微调器 - Flutter