2013-08-19 4 views

ответ

22

Если ваши шаблоны прекомпилированы, вы можете получить доступ к партиалам через Handlebars.partials['partial-name'](), а также вызывать их из шаблона через {{> partial}} помощника.

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

например:

function elementFromTemplate(template, context) { 
    context = context || {}; 
    var temp = document.createElement('div'); 
    temp.innerHTML = templates[template] ? templates[template](context) : Handlebars.partials[template](context); 
    return temp.firstChild; 
} 

myDiv.appendChild(elementFromTemplate('myPartial', context));

myDiv.appendChild(elementFromTemplate('a-whole-template'));

Надеется, что это поможет кому-то, кто хочет использовать рули, как я.

+0

Handlebars.partials ['partial-name'] не возвращает функцию, но возвращает шаблон (строку). Спасибо, что указали на это. – mynameistechno

+0

@mynameistechno Возможно, потому что вы не прекомпилируете свои шаблоны (как и должно быть!) –

1

Чтобы использовать частичный шаблон, просто введите {{> partialName}}.

<script id="base-template" type="text/x-handlebars-template"> 
    <div> 
    {{> person}} <!-- This is the partial template name --> 
    </div> 
</script> 

<script id="partial-template" type="text/x-handlebars-template"> 
    <div class="person"> 
    <h2>{{first_name}} {{last_name}}</h2> 
    <div class="phone">{{phone}}</div> 
    </div> 
</script> 

<script type="text/javascript"> 
    $(document).ready(function() { 
    var template = Handlebars.compile($("#base-template").html()); 

    //Aliasing the template to "person" 
    Handlebars.registerPartial("person", $("#partial-template").html()); 

    template(yourData); 
    } 
</script> 
+2

И как бы я отрисовал это частично из javascript (а не в шаблоне)? –

+0

Вы имеете в виду это -: el.html (this.template (yourData)); –

+0

Просто fyi, почему это не принятый ответ. Это вся информация, которая легко встречается в документации Handlebar и является основным использованием частичного. Я был полностью осведомлен о том, как использовать частичное внутри шаблона, прежде чем задавать вопрос, но потребовалось некоторое перекопание в исходный код Handlebar, чтобы узнать, как частично вынести частичное из javascript. –

14

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

Handlebars.partials = Handlebars.templates 

Это позволяет использовать шаблоны, как обычно, и как обертоны, а также:

{{> normalTemplate}} 
+1

Интересная идея. Есть ли недостаток или причина, по которой вам когда-либо понадобились частичные, которые не являются нормальными шаблонами? (Если нет, кажется, Handlebars может просто использовать синтаксис '{{> xxx}}', чтобы означать включение другого шаблона, и вообще не иметь концепции частичных?) –

+1

Точно моя мысль. Я не понимаю понятия частичных понятий и еще не нашел достаточной причины для их использования. Думаю, это конвенция? Или какая-то оптимизация ... Что не имеет значения, если вы (и вы должны) прекомпилировать шаблоны. Я мог бы что-то упустить, но, по крайней мере, с предварительной компиляцией, этот метод кажется безопасным. –

+2

Действительно интересный «взлом», весьма полезный с заранее скомпилированными шаблонами! – Vadorequest

4

оказывать частично из Javascript вы можете использовать

Handlebars.partials["myPartial"]()