Можно ли присвоить переменную внутри шаблона и использовать ее как переменную извне?
Пример:
Я хочу вывести таблицу, но 1 столбец необязателен, зависит от того, существуют данные (fields[].field2) или нет.
В каждой строке проверить не проблема, но как проверить заголовок?
<table>
<thead>
<tr>
<th>Head 1</th>
<th>Head 2 (optional)</th>
<th>Head 3</th>
</tr>
</thead>
{{#each fields}}
<tr>
<td>{{{field1}}}</td>
{{#if field2}}<td>{{{filed2}}}</td>{{/if}}
<td>{{{field3}}}</td>
</tr>
{{/each}}
</table>
На данный момент я использую неустойчивую вспомогательную функцию «assign», которая создает помощников.
{{#each fields}}
{{#if field2}}
{{assign "helperVar" "<th>Head 2 (optional)</th>"}}
{{/if}}
{{/each}}
Output with: {{{helperVar}}}
Но это не очень хорошее решение, и я не могу использовать его в #if.
Это противоречит предпосылке нелогичных шаблонов, и я не думаю, что это должна быть конструкция на уровне языка.
Я думаю, что рекомендуемым подходом здесь будет вычисление этих данных в вашей логике создания контекста и передача их в шаблон. Это обеспечивает гораздо больший контроль, поскольку в вашем распоряжении есть полный язык javascript, а не какое-либо его подмножество, реализованное в языке шаблона.
template({
fields: fields,
hasField2: _.any(fields, function(item) { return item.field2; })
});
Я думаю, что это было бы хорошей функцией не для того, чтобы добавить больше логики в шаблон, а для передачи переменных, специфичных для этого шаблона.
Например, 2 моих шаблона используют один и тот же частичный файл. Я хотел бы иметь возможность передавать некоторые переменные в этот частичный уровень с уровня шаблона, чтобы разные вещи выводились для другого шаблона в рамках частичного.
+1
+1
:+1:
:+1:
@kpdecker У нас могут быть циклы, операторы if и ряд других логических конструкций в шаблонах. Но, видимо, назначение переменной — это _слишком_ много логики в шаблонах? Я действительно не понимаю причину этого решения, когда другие помощники по умолчанию содержат гораздо больше логики, чем просто возможность присваивать переменную.
+1
+1
+1
+1
Что-то в этом роде может быть реализовано с использованием параметров блока и задокументировано здесь:
http://handlebarsjs.com/block_helpers.html#block -параметры
Поскольку это делается в отдельном пространстве имен вне текущего контекста, это обеспечивает более согласованное поведение по сравнению с назначением контекста.
Самый полезный комментарий
:+1:
@kpdecker У нас могут быть циклы, операторы if и ряд других логических конструкций в шаблонах. Но, видимо, назначение переменной — это _слишком_ много логики в шаблонах? Я действительно не понимаю причину этого решения, когда другие помощники по умолчанию содержат гораздо больше логики, чем просто возможность присваивать переменную.