为什么设置 Meteor 模板数据上下文会替换父数据上下文?

Why Does Setting Meteor Template Data Context Replace Parent Data Context?

我想将参数传递给我在循环中调用的模板:

<template name="show_people">
    <div class="panel-body">
       {{#each people}}
           <div>
                {{>person }}
                {{>person doing="running up the hill"}}
           </div>
      {{/each}}
    </div>
</template>

<template name="person">
     <h3>{{name}} is {{doing}}</h3>
</template>

帮手javascript:

Template.show_people.helpers({
    people: function() { return [{ name: 'Jack' },{ name: 'Jill' }]; }
});

向模板添加 'doing' 参数似乎破坏了循环项的上下文。这是我要回复的内容:

Jack is
is running up the hill
Jill is
is running up the hill

我希望人员模板能够访问参数和上下文。如何实现?

快速技巧:将名称参数传递给从父上下文复制的模板。

{{> person name=name doing="running up the hill"}}

接受的答案解决了您的问题,但没有解释为什么您会遇到现在的问题。如果您查看模板包含部分 header 下的 this article,您就会找到原因。

基本上,就在您的 {{#each people}}{{/each}} 代码块内部,任何包含模板的数据上下文将是 people collection 中的列表项。对于您的前两个代码片段,people 的两个实例的两个数据上下文将是 {name: "Jack"}{name: "Jill"},这就是您看到 [=15= 的原因] 和 Jill is 正在为这两个模板实例打印出来。数据上下文不包含 doing 参数。

当您以第二种方式 ({{> person doing='running up the hill') 引用您的 person 模板时,该模板实例的数据上下文将被重置,并创建一个仅具有指定参数的全新数据上下文。对于 person 模板的两个实例,数据上下文都是 {doing: "running up the hill"},这就是为什么您看到 is running up the hill 被打印了两次。

如您所见,数据上下文设置不是附加的,而是排他的。数据上下文要么是给定模板引用出现的代码块的 parent 数据上下文,要么是由模板引用中定义的所有参数组成的覆盖数据上下文。接受的答案之所以有效,是因为您将两个数据上下文组合到一个覆盖的数据上下文中,以在 person 模板中使用。