The {{#each}} template tag 的特殊之处在于它改变了它的内部上下文。
事实上,每个模板都可以与一袋数据一起使用(例如帖子的标题和内容)。此数据包注册在模板的自己的上下文中,可以在帮助程序中使用this.someData 或通过在模板中简单地命名 ({{someData}}) 来引用。
{{#if}} 等其他模板标签不会更改其中模板的上下文。您可以在博客文章模板中键入,该模板接收博客文章对象作为数据:
<h3>{{title}}</h3>
<p>{{content}}</p>
{{#if userIsSecretAgent}}
<blink>{{secretData}}</blink>
{{/if}}
(秘密是你必须以与文本相同的频率闪烁才能阅读它,这就是为什么这个标签被使用了这么长时间)
{{#each}} 允许您将模板的内部上下文更改为迭代的当前对象,从而简单地访问您正在迭代的对象的内容。
假设您要制作一个显示博客文章列表的博客文章模板:
{{#each blogPosts}}
<!-- Here, how do you gain access to each title, each content, ..? -->
<!-- Well, the context has changed! -->
<!-- Now we can directly access each datum of the iterable through the context -->
<!-- The result simply becomes: -->
<h3>{{title}}</h3>
<p>{{content}}</p>
{{#if userIsSecretAgent}}
<blink>{{secretData}}</blink>
{{/if}}
{{/each}}
{{#each}} 块内的上下文与父块不同,而是一篇博文,我们可以简单地通过名称来引用每个博文字段!
但现在我们正在重复代码。重用我们以前的模板不是很好吗?
{{#each blogPosts}}
{{> blogPost}}
{{/each}}
blogPost 模板需要一个博客文章对象作为其上下文,我们使用{{#each}} 模板标签提供此上下文。
助手的工作方式相同,只是您必须在其中输入this.title 或this.content。您还必须使用Template.instance() 在某些地方引用模板(而不是this)。
更多魔法请见SpaceBars docs。