Подтвердить что ты не робот

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

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

<template name="base">
  {{#if a}}{{> a}}{{/if}}
  {{#if b}}{{> b}}{{/if}}
  {{#if c}}{{> c}}{{/if}}
</template>

И в соответствующем JS:

Template.base.a = function () {
  return (mode === "a");
}

Template.base.b = function () {
  return (mode === "b");
}

Template.base.c = function () {
  return (mode === "c");
}

..., который поражает меня как чрезвычайно многословную. То, что я действительно хотел бы сделать, это что-то вроде:

<template name="base">
  {{> {{mode}} }}
</template>

Другими словами, значение mode будет именем вызываемого частица.

Кажется, что это очень распространенный случай использования, но я не могу найти примеров этого онлайн. Где я ошибся?

4b9b3361

Ответ 1

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

  • Содержимое Handlebars.partials может быть строками или функциями, поэтому вам необходимо скомпилировать частичные файлы при первом использовании.
  • Handlebars не знает, будет ли частичный text/plain или text/html, поэтому вам нужно будет вызвать своего помощника в {{{...}}} или {{...}}, если это необходимо.
  • Этот материал не точно документирован (по крайней мере, не где-нибудь, что я могу найти), поэтому вам нужно перестроить источник Handlebars и поработать с помощью console.log(arguments), чтобы выяснить, как использовать Handlebars.partials.
  • Вы должны передать this вручную, когда вы вызываете помощника.

Не бойтесь, это не так уж сложно. Что-то простое:

Handlebars.registerHelper('partial', function(name, ctx, hash) {
    var ps = Handlebars.partials;
    if(typeof ps[name] !== 'function')
        ps[name] = Handlebars.compile(ps[name]);
    return ps[name](ctx, hash);
});

должен сделать трюк. Тогда вы можете сказать:

{{{partial mode this}}}

и займитесь более интересными вещами.

Демо: http://jsfiddle.net/ambiguous/YwNJ3/2/

Ответ 2

Обновление для 2016: Добавлена ​​версия 3 рулей Динамические частицы. Из документов:

Можно динамически выбирать частичное выполнение, используя синтаксис подвыражения.

{{> (whichPartial) }}

Будет оценивать whichPartial, а затем отобразить частичное имя которого возвращается этой функцией.

Подвыражения не разрешают переменные, поэтому whichPartial должна быть функцией. Если простая переменная имеет частичное имя, ее можно разрешить с помощью помощника lookup.

 {{> (lookup . 'myVariable') }}