В настоящее время я имею дело с handlebars.js в приложении express.js. Чтобы сохранить модульность, я разбил все свои шаблоны на части.
Моя проблема : я не мог найти способ передать переменные через частичный вызов. Скажем, у меня есть партиал, который выглядит так:
<div id=myPartial>
<h1>Headline<h1>
<p>Lorem ipsum</p>
</div>
Предположим, я зарегистрировал этот партиал с именем myPartial. В другом шаблоне я могу сказать что-то вроде:
<section>
{{> myPartial}}
</section>
Это нормально работает, часть будет отрисована, как и ожидалось, и я счастливый разработчик. Но теперь мне нужен способ передачи различных переменных через этот вызов, чтобы, например, в партиале проверить, задан ли заголовок или нет. Что-то вроде:
<div id=myPartial>
{{#if headline}}
<h1>{{headline}}</h1>
{{/if}}
<p>Lorem Ipsum</p>
</div>
И вызов должен выглядеть примерно так:
<section>
{{> myPartial|'headline':'Headline'}}
</section>
или так.
Я знаю, что могу определить все данные, которые мне нужны, прежде чем визуализировать шаблон. Но мне нужен способ сделать это, как я только что объяснил. Есть ли способ?
источник
this
, не могли бы вы передать свой контекст? Например, определите дополнительные данные для передачи, например{new_variable: some_data}
?{{> partialName {new_variable: some_data} }}
key=value
. Есть ли какие-нибудь проблемы с этим в github?На всякий случай вот что я сделал, чтобы получить частичные аргументы. Я создал небольшого помощника, который принимает частичное имя и хэш параметров, которые будут переданы в партиал:
Ключевым моментом здесь является то, что помощники Handlebars принимают хэш аргументов, подобный Ruby . Во вспомогательном коде они входят как часть последнего аргумента функции
options
- в ееhash
члене. Таким образом, вы можете получить первый аргумент - частичное имя - и получить данные после него.Затем вы, вероятно, захотите вернуть a
Handlebars.SafeString
от помощника или использовать «тройной тайник»{{{
- чтобы предотвратить двойное экранирование.Вот более-менее полный сценарий использования:
Надеюсь, это поможет… кому-то. :)
источник
Это очень возможно, если вы напишете собственный помощник. Мы используем специальный
$
помощник для выполнения этого (и не только) типа взаимодействия:источник
hbs.registerPartials(path.join(__dirname, '/views/partials'), function() { utils.precompileHandlebarsPartials(hbs); }); // Pre compile the partials precompileHandlebarsPartials : function(hbs) { var partials = hbs.handlebars.partials; for (var partial in partials) { if (typeof partials[partial] === 'string') { partials[partial] = hbs.handlebars.compile(partials[partial]); } }; }
Это также можно сделать в более поздних версиях руля, используя
key=value
обозначение:Позволяет передавать определенные значения в частичный контекст.
Ссылка: Другой контекст для части № 182
источник
Принятый ответ отлично работает, если вы просто хотите использовать другой контекст в своем частичном. Однако он не позволяет ссылаться на родительский контекст. Чтобы передать несколько аргументов, вам нужно написать собственный помощник. Вот рабочий помощник для Handlebars
2.0.0
(другой ответ работает для версий<2.0.0
):Затем в своем шаблоне вы можете сделать что-то вроде:
И в вашем партиале вы сможете получить доступ к этим значениям как к контексту, например:
источник
Похоже, вы хотите сделать что-то вроде этого:
Иегуда уже дал вам способ сделать это:
Но чтобы уточнить:
Чтобы предоставить вашей части собственные данные, просто дайте ей свою собственную модель внутри существующей модели, например:
Другими словами, если это модель, которую вы даете своему шаблону:
Затем добавьте новый объект в партиал:
childContext
становится контекстом частичного, как сказал Иегуда - в этом он видит только полеanother
, но не видит (или не заботится о полеsome
). Если у вас былаid
модель верхнего уровня и повторить ещеid
раз в childContext, это будет работать нормально, поскольку частичный вид видит только то, что находится внутриchildContext
.источник
Да, я опоздал, но я могу добавить для пользователей Assemble : вы можете использовать встроенный
"parseJSON"
помощник http://assemble.io/helpers/helpers-data.html . (Обнаружено на https://github.com/assemble/assemble/issues/416 ).источник
Не уверен, что это полезно, но вот пример шаблона Handlebars с динамическими параметрами, переданными во встроенную часть RadioButtons, и клиентом (браузером), отображающим переключатели в контейнере.
Для меня он отображается с помощью Handlebars на сервере и позволяет клиенту завершить его. С его помощью инструмент форм может предоставлять встроенные данные в Handlebars без помощи помощников.
Примечание. Для этого примера требуется jQuery.
источник