2015-01-18 2 views
10

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

  • оригинальный контекст данных: {сообщение: "привет"} {{> myTemplate withIcon=True}}
  • контекст данных перекрываться с {withIcon: True}

Acually мое решение, чтобы обернуть данные, как это.

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

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

ответ

13

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

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> 

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

+0

Можете ли вы разработать немного больше? Зачем вам делать что-то _.clone (это)? – massimosgrelli

+0

Зачем вам делать что-то _.clone (это)? Что делать, если я добавляю результат в дочерний контекст данных? Что-то вроде iconContext: function (childDataLikeMsgPost) {... childDataLikeMsgPost.withIcon = ...} Это очень помогло бы мне – massimosgrelli

7

Опираясь на David's second option, чтобы позволить нескольким атрибутам:

<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; 
}) 
+0

Это действительно приятно. –

+2

Это должно работать также: 'return _.extend ({}, this, data.hash);' –

Смежные вопросы