【问题标题】:Loading message during template redraw in Meteor在 Meteor 中重绘模板期间加载消息
【发布时间】: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


【解决方案1】:

您可以使用Template.myTemplate.created = function ( ) { ... },如meteor documentation 中所述。您也许可以在创建模板时运行一些 jQuery,并在正文中添加一个加载类,然后在 Template.myTemplate.rendered 上,删除加载类?

【讨论】:

  • 根据(我对文档的解释),这只会在第一次渲染时起作用,而不是在重新渲染时起作用。 "当调用 myTemplate 表示模板的新出现而不是现有模板实例的重新呈现时,将调用此回调。"
【解决方案2】:

以防万一您从未解决过此问题,我想分享另一位用户的解决方案,他在my question 的回复中发布了该解决方案。由 nate-strauser 回答 here

挂钩到集合的 .ready() 方法以确定何时可以显示它。当所有数据都加载到客户端时,这将返回 true。您看到的是空的,然后是部分的,然后是完整的渲染,因为您的代码没有等待所有数据,而是在数据到达时渲染。这不是一件坏事,但并不总是可取的。您可以使用类似 https://github.com/oortcloud/unofficial-meteor-faq#how-do-i-know-when-my-subscription-is-ready-and-not-still-loading 的方式推出自己的解决方案,但我建议将 Iron-router 和 waitOn 函数用于有问题的路由 https://github.com/EventedMind/iron-router#waiting-on-subscriptions-waiton,当它与 loadingTemplate 选项结合使用时,您可以做得很好(正在加载....) 加载时消息,然后立即转换到完全填充的模板

您可以忽略全部部分。

【讨论】:

  • 这个问题还没有解决。 ready 方法仅在集合最初加载时有帮助,对未来的模板重绘和计算失效没有帮助。正如我最初的问题所述,我已经在使用ready。谢谢!
猜你喜欢
  • 2014-02-22
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2014-04-14
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多