我有一个名为 task_list
的模板,它长这样:
{{#each tasks}}
{{> task}}
{{/each}}
Template.task_list.tasks
返回一个集合,在用户界面中似乎需要一些时间才能加载完毕。
在集合加载过程中,我想显示一个加载指示器。
有没有什么想法可以实现这个功能?
顺便说一下,我尝试了模板中的rendered
事件,但它在列表实际加载之前被触发。我还尝试在task
模板上使用rendered
,但好像从未被调用。
我有一个名为 task_list
的模板,它长这样:
{{#each tasks}}
{{> task}}
{{/each}}
Template.task_list.tasks
返回一个集合,在用户界面中似乎需要一些时间才能加载完毕。
在集合加载过程中,我想显示一个加载指示器。
有没有什么想法可以实现这个功能?
顺便说一下,我尝试了模板中的rendered
事件,但它在列表实际加载之前被触发。我还尝试在task
模板上使用rendered
,但好像从未被调用。
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>
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}}
< p > 更新:使用iron-router,您可以直接指定一个loading
模板,在订阅加载时显示。
iron-router
风格的主页面加载器之外,还要有一个迷你加载器。是否有一种方法可以在我的“header”模板中检查页面上剩余的模板是否已准备好?我只能想到如何等待实际上加载非常快的那个包含加载器的模板。我尝试使用绝对定位CSS将我的迷你加载器从iron-router
加载器中“放置”到导航栏中,但在某些页面和转换中会出现问题。将其实际放在我的头文件中是理想的。 - evolross这段时间推出了一些不错的软件包。看看这两个:
它们都可以直接使用,如果需要更高级的选项,请查看它们的文档。
Template.subscriptionsReady
助手。更多详情请参见我的回答。 - Dan Dascalescu