{{#each posts}}
{{> post}}
{{else}}
loader.gif
{{\each}}
我在else
意外发现了each
,似乎它的工作非常好(至少在我的本地主机上)。我想要的是当meteor仍在从数据库中检索posts
时显示加载器。它做这个工作吗? else
中each
的注意事项是什么?
答案 0 :(得分:1)
是的,它可以很好地完成你想要做的事情。
来自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文档}。)