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

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

  • исходный контекст данных: {message: "hello" } {{> myTemplate withIcon=True}} Контекст
  • переопределяется с помощью {withIcon: True}

На самом деле мое решение состоит в том, чтобы обернуть данные следующим образом.

<code>
{{> myTemplate originalData=this withIcon=True}}
</code>

Есть ли лучшее решение?

Ответ 1

Вы всегда можете расширить текущий контекст в помощнике:

Template.parentTemplate.helpers({
  iconContext: function() {
    var result = _.clone(this);
    result.withIcon = true;
    return result;
  }
});

И используйте его следующим образом:

<template name="parentTemplate">
  {{> myTemplate iconContext}}
</template>

В качестве альтернативы вы можете создать более общий помощник, например:

Template.registerHelper('extendContext', function(key, value) {
  var result = _.clone(this);
  result[key] = value;
  return result;
});

И затем выберите пары ключ/значение из html любого шаблона:

<template name="parentTemplate">
  {{> myTemplate extendContext 'withIcon' true}}
  {{> myTemplate extendContext 'isAwesome' false}}
</template>

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

Ответ 2

Основываясь на Дэвид второй вариант, чтобы разрешить несколько атрибутов:

<template name="parentTemplate">
  {{> myTemplate extendContext withIcon=true label="Has Icon" }}
  {{> myTemplate extendContext withIcon=false label="No Icon" }}
</template>

а затем в javascript:

Template.registerHelper('extendContext', function(data) {
  var result = _.clone(this);
  _.each(data.hash, function(value, key) {
    result[key] = value;
  })
  return result;
})