我正在获取一组记录并将它们放在模板中,让它们呈现{{#each}}
,并且我想显示一个加载图标,直到呈现最后一个 DOM 节点。
我的问题是我还没有找到一种方法来查询状态/在最后一个渲染的项目上触发回调,也就是要更新/重新绘制的最后一个 DOM 节点。
在我的 HTML 文件中看起来有点像这样:
<template name="stuff">
{{#each items}}
<div class="coolView">{{cool_stuff}}</div>
{{/each}}
</template>
在客户端的 JS 文件中:
// returns all records of Stuff belonging to the currently logged-in user
Template.stuff.items = function () {
Session.set('loading_stuff', true);
return Items.find({owner: Meteor.userId()}, {sort: {created_time: -1}});
};
Template.stuff.rendered = function() {
// every time something new is rendered, there will have been loading of the DOM.
// wait a short while after the last render to clear any loading indication.
Session.set('loading_stuff', true);
Meteor.setTimeout(function() {Session.set('loading_stuff', false);}, 300);
};
loading_stuff
在 Handlebars 助手中查询Session 变量,如果它是true
.
我这样做的原因Meteor.setTimeout
是因为在渲染到模板中的每个项目之后都会Template.rendered
调用它。所以我需要重新确认它仍在加载,但给它一些时间来加载下一个或完成全部渲染,稍等片刻,直到它设置为.loading_stuff
false
如何在所有 DOM 更新(针对特定模板或整个页面)结束时以正确的 Meteor 方式可靠地查询/回调?
非常感谢。
编辑
使用回调的解决方案仅部分有效:subscribe()
onReady()
在渲染开始之前,模板似乎被多次调用(2-3)次,但是在数据从模板依赖渲染的服务器返回之后。这意味着它已经“完成”了加载数据,但 DOM 仍在渲染中。我会玩Meteor.autorun()
,看看我是否能在某个地方找到一个可靠的钩子来正确地做到这一点。与此同时,我想我原来的问题仍然存在:
我怎么知道整个模板/页面何时完成渲染?
最终编辑:
归根结底,根据 DOM 的结构,开发人员需要拥有坚如磐石的 DOM,并尽可能将适当的回调附加到他/她想要检查其状态的元素。这似乎是一个反气候的明智之举,但对我来说,知道模板的最终元素被渲染的唯一方法是在模板的最后呈现一个具有特殊 id 的元素,它表示结束渲染并为其附加.livequery
回调。我希望 Meteor 将来会为检查这个状态加入一个更加统一和全球性的支持。