2016-08-05 2 views
0

Можно ли отобразить шаблон или даже частичный из контекста, переданного шаблону верхнего уровня? Похоже, это может потребовать рекурсивного рендеринга, но, возможно, я чего-то не хватает.Шаблон рендеринга в контексте в Handlebars

Приведенный ниже пример демонстрирует использование Bootstrap.

Скажи это мой главный шаблон уровня:

<div class="panel"> 
    <div class="panel-body"> 
    {{{description}}} 
    </div> 
</div> 

И мой контекст:

{ 
    description: "\ 
    Some text before the warning.\ 

    <div class=\"alert alert-warning\" role=\"alert\">\ 
     <span class=\"glyphicon glyphicon-warning-sign\" aria-hidden=\"true\">&nbsp;</span>\ 
     My warning here.\ 
    </div>\ 

    Some text after the warning." 
} 

То, что я хотел бы сделать, это отдельное предупреждение в частичное по ряду причин :

  • Произвольное размещение в окружающем тексте
  • Можно сделать партиалы для других типов, чем предупреждение (опасность, информация и т.д.)
  • Можно добавить столько, сколько необходимо вкраплены в контексте строки

По этим причинам, похоже, это не возможно поставить его в шаблон верхнего уровня.

Парциальное будет выглядеть примерно так:

<script id="partial-warning-template" type="text/x-handlebars-template"> 
    <div class="alert alert-warning" role="alert"> 
    <span class="glyphicon glyphicon-warning-sign" aria-hidden="true">&nbsp;</span> 
    {{{warning-message}}} 
    </div> 
</script> 

После того, как это на месте, я смог бы использовать его как так:

{ 
    description: "\ 
    Some text before the warning.\ 

    {{> partial-warning-template \"My warning here.\"}}\ 

    Some text after the warning.\ 

    {{> partial-warning-template \"Now adding a second warning.\"}}" 
} 

Может быть, я что-то отсутствует фундаментальное - есть ли более идиоматический способ сделать это?

ответ

0

Вы не сможете включить частичные блоки в значение description и ожидать, что они будут оцениваться как частичные методом шаблона верхнего уровня; вся строка description будет вытеснена в виде единственной литеральной строки.

Что вам нужно сделать, так это оценить частичные оценки до, чтобы передать объект контекста с помощью description методу шаблона верхнего уровня.

Если предварительно скомпилированных ваш парциальное в чем-то вроде следующим образом:

Handlebars.registerPartial('warn', Handlebars.compile(document.getElementById('partial-warning-template').innerHTML)); 

Тогда вы будете в состоянии назвать это частичное, когда вы строите свой description строку:

{ 
    description: 'Some text before the warning.' + 
       Handlebars.partials.warn({ 'warning-message': 'My warning here.' }) + 
       'Some text after the warning.' + 
       Handlebars.partials.warn({ 'warning-message': 'Now adding a second warning.' }) 
} 
+0

Спасибо! Для справки я назначил скомпилированный шаблон стандартной функции, а не загрязнял объект partials, но тот же эффект. let warn = Handlebars.compile ($ ("# partial-warning-template"). Html()); и позже + предупредить («Мое предупреждение здесь.») + «Какой-то текст после предупреждения» + предупреждает («Теперь, добавив второе предупреждение.») «Какой-то текст до предупреждения.»; Где мой шаблон имел {{{this}}} как внутренний контент. –