【发布时间】:2013-10-08 17:59:25
【问题描述】:
我构建了我的第一个 Meteor 应用程序,我很喜欢它。除了,现在它有真实的生产数据,它有点慢。我收到报告说“当我单击此按钮时没有发生任何事情”。
有没有办法在模板重绘期间显示加载消息,以便用户知道正在发生的事情?
为了进一步说明,请查看此模板(不是我的实际代码,仅为简单起见):
Template.all_posts.posts = function() {
return Posts.find({'category_id': Session.get('current_category')});
}
因此,如果打开我的控制台并运行Session.set('current_category', 1),假设运行计算和重绘模板需要 2 秒。我想在那 2 秒内显示一个加载指示器。
明确地说,我已经知道如何显示加载指示器。事实上,我已经在初始页面加载时执行此操作,并在我的所有订阅均为ready() 时将其隐藏。我只是想知道在哪里应用相同的逻辑(显示和隐藏加载图标),以便每次重绘模板时都会发生这种情况。伪代码可以正常工作:
总之,当 Meteor 忙的时候,我想反映这一点。
非常感谢任何帮助!
编辑 10/09/13:
来自文档...
这些 Meteor 函数将您的代码作为响应式计算运行:
- 模板
- Meteor.render 和 Meteor.renderList
- Deps.autorun
我认为一种可能的解决方案可以开始当任何这些“计算”无效时显示加载指示器。
例如,如果您在 Deps.autorun 内运行代码,则计算实例作为第一个参数传递,您可以将回调传递给它的 onInvalidate 方法,如下所示:
Deps.autorun(function(computation) {
// do reactive stuff
computation.onInvalidate(function() {
// display loading indicator
});
});
但是,据我所知,您无法在其他 Meteor 方法中访问计算对象,只能访问 Deps.autorun。
至于隐藏加载指示器,我认为最好的办法是在要(重新)渲染的最后一个模板的rendered 回调中进行,因为计算。
有人对此有任何见解、建议、技巧、技巧等吗?
【问题讨论】:
-
你能举一个更有代表性的例子来说明你在做什么吗?也许 github 上的一个小副本可以说明问题?
-
@alanning Meteor 的任何例子都可以。基本上,我想在任何计算无效时显示加载消息,并在最后一个模板完成(重新)渲染时隐藏它。
-
模板加载指示器...似乎您需要修补 Spark 以在无效时调用挂钩。但是 Spark 正在被重写,所以不会长期有用。可以采取一些措施来提高您的应用程序的速度,使其不再需要它。一般来说,渲染应该是相当即时的。如果没有,可能有机会稍微重构一下设计。
-
@alanning Spark 补丁...这就是我的想法,但这会包括所有内容,包括计算吗?还是只是模板渲染?让它更快可能是正确的。它是我的第一个 Meteor 应用程序。我正在一点一点地提高它的性能。不幸的是,我的应用程序在另一个应用程序的浏览器外壳中运行,我没有源访问权限,并且它使用 IE7 渲染引擎。但是当我在 Chrome 中运行时它仍然相当慢,所以我会坚持下去。
标签: javascript meteor