【发布时间】:2013-01-10 23:56:11
【问题描述】:
我正在获取记录集合并将它们放置在模板中,让它们呈现{{#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);
};
在 Handlebars 帮助器中查询 Session 变量 loading_stuff,如果它是 true,则返回加载类的名称(带有加载器图标 GIF)。
我之所以使用尴尬的Meteor.setTimeout 是因为Template.rendered 在被渲染到模板中的每个项目之后被调用。所以我需要重新确认它仍在加载,但给它一些时间来加载下一个或完成全部渲染,稍等片刻,直到它将loading_stuff 设置为false。
如何在所有 DOM 更新(针对特定模板或整个页面)结束时以正确的 Meteor 方式可靠地查询/回调?
非常感谢。
编辑
使用subscribe() onReady() 回调的解决方案仅部分有效:
在渲染开始之前,模板似乎被多次调用 (2-3) 次,但 在 之后,数据已从模板所依赖的渲染服务器返回。这意味着它已经“完成”了加载数据,但 DOM 仍在渲染中。我将与Meteor.autorun() 一起玩,看看我是否可以在某个地方找到一个可靠的钩子来正确地做到这一点。与此同时,我想我原来的问题仍然存在:
我如何知道整个模板/页面何时完成渲染?
最终编辑:
归根结底,根据 DOM 的结构,开发人员需要拥有坚如磐石的 DOM,并尽可能将适当的回调附加到他/她想要检查状态的元素上.这似乎是一个反气候的明智之举,但对我来说,知道模板的最终元素被渲染的唯一方法是在模板的最后呈现一个具有特殊 id 的元素,这标志着结束渲染并附加一个.livequery 回调给它。我希望 Meteor 将来会为检查这种状态提供更统一和全球性的支持。
【问题讨论】:
-
在stackoverflow.com/questions/14532630/meteor-database-latency 上查看答案,虽然不完全是您正在寻找的内容,但它可能会有所帮助