Почему установка контекста данных шаблона Meteor заменяет контекст родительских данных?

Я хочу передать аргумент шаблону, который вызываю в цикле:

<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' }]; }
});

Добавление аргумента «выполнение» к шаблону, кажется, стирает контекст элемента цикла. Вот что я получаю:

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

Я бы хотел, чтобы шаблон человека имел доступ как к аргументу, так и к контексту. Как этого добиться?


person user2592664    schedule 28.05.2015    source источник


Ответы (2)


Быстрый прием: передайте вашему шаблону аргумент имени, который скопирован из родительского контекста.

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

Принятый ответ решает вашу проблему, но не дает объяснения, почему вы столкнулись с этой проблемой. Если вы прочитаете эту статью под заголовком раздела "Шаблон включает" вы найдете причину.

По сути, непосредственно внутри вашего {{#each people}}{{/each}} блока кода контекст данных любых содержащихся в нем шаблонов будет элементом списка в коллекции people. В случае ваших первых двух фрагментов кода два контекста данных для двух экземпляров people будут {name: "Jack"} и {name: "Jill"}, поэтому вы видите, что Jack is и Jill is распечатываются для этих двух экземпляров шаблона. Контекст данных не содержит параметра doing.

Когда вы ссылаетесь на свой person шаблон вторым способом ({{> person doing='running up the hill'), контекст данных для этого экземпляра шаблона сбрасывается и создается полностью новый контекст данных только с указанными параметрами. Для обоих экземпляров вашего person шаблона контекст данных будет {doing: "running up the hill"}, поэтому вы видите, что is running up the hill распечатывается дважды.

Итак, как видите, настройка контекста данных не аддитивная, а, скорее, эксклюзивная. Либо контекст данных является родительским контекстом данных для блока кода, в котором появляется данная ссылка на шаблон, либо это замещенный контекст данных, состоящий из всех параметров, определенных в ссылке на шаблон. Причина, по которой принятый ответ работает, заключается в том, что вы объединяете оба контекста данных в один переопределенный контекст данных, который будет использоваться в шаблоне person.

person Keith Dawson    schedule 21.07.2015