每个其他人都是放置加载图像的好地方吗?

时间:2014-09-04 03:05:44

标签: javascript meteor

{{#each posts}}
    {{> post}}
{{else}}
    loader.gif
{{\each}}

我在else意外发现了each,似乎它的工作非常好(至少在我的本地主机上)。我想要的是当meteor仍在从数据库中检索posts时显示加载器。它做这个工作吗? elseeach的注意事项是什么?

2 个答案:

答案 0 :(得分:1)

首先,回答你的问题......

是的,它可以很好地完成你想要做的事情。

Else是一个特殊的块助手

来自Handlebars的非官方文档来源,其中的空间栏/火焰/未来的东西吸引了它的灵感。

  

{{else}} ...可与任何块帮助程序一起使用,以表示如果给定表达式求值为假值,应输出的内容。

所以,实际上,无论您使用的是#if#each#with等,哪个阻止帮助您都无关紧要。 ..行为基本相同。

也就是说,如果您的参数(在本例中为posts)的计算结果为falsy value,则会对其后的块进行评估。

那些警告......

没有任何警告,但关于虚假值的一个棘手的事情是空数组实际上是真的。因此,根据您的示例,如果posts 已定义,但为空,则仍将评估第一个块,并为您留下空输出。对于您来说,这是理想的,因为您希望在定义之前显示加载块。但是,我很容易看到有人解决了以下问题:

{{#each posts}}
    {{content}}
{{else}}
    There are no posts today.
{{/each}}

您的空posts数组将评估为true,您永远不会看到缺少帖子消息。但是,由于0的计算结果为false,您可以将块包装在#if帮助器中:

{{#if posts.length}}
    {{#each posts}}
        {{content}}
    {{else}}
        {{>spinner}}
    {{/each}}
{{else}}
    Sorry, there are no posts today.
{{/if}}

来源: http://blog.teamtreehouse.com/handlebars-js-part-2-partials-and-helpers

答案 1 :(得分:1)

我认为这不是一个好主意。

{{else}}为空时,会出现{{#each cursor}}块助手中的cursor。您希望在该游标后面的订阅尚未准备好时显示加载微调器。至少在两种情况下,这些不一样:

1。光标中实际上没有任何帖子。例如,用户搜索了一些帖子,没有与搜索匹配的帖子,或者应用程序刚刚上线,并且根本没有任何帖子。在这种情况下,用户将永远看到加载微调器,并假设您的应用程序已损坏。

最好在{{else}}中添加一些消息,这样用户就不会对空列表感到困惑:

{{#each posts}}
  {{> post}}
{{else}}
  There are no posts.
{{/each}}

2。客户端已从服务器收到一些帖子,但不是全部。您希望显示微调器,直到所有帖子都到达,但是使用{{else}}实现时,一个帖子到达时微调器就会消失。当其他帖子到达时,您会看到它们在到达时出现,这可能是不和谐的。由于低延迟,您可能无法在开发中看到这种情况,但在生产中,它更有可能。

正确的方法是使用订阅句柄的被动ready方法:

{{#if postsReady}}
  {{#each posts}}
    {{> post}}
  {{else}}
    There are no posts.
  {{/each}}
{{else}}
  loader.gif
{{/if}}
// Somewhere in your code, something like this:
var postsSubscription = Meteor.subscribe(/* ... */);

// Top level:
Template.posts.helpers({
  postsReady: function() { return postsSubscription.ready(); },
  posts: function() { return Posts.find(); }
});

您还应该考虑使用iron:router,它可以很好地处理使用waitOn等待订阅的问题。

(如果您之前从未见过Meteor.subscribe,那么您可能正在使用autopublish,这不适合真正的应用。请查看{{3}上的Meteor文档}。)