É possível atribuir uma variável dentro de um modelo e usá-la como variáveis externas?
Exemplo:
Eu quero a saída de uma tabela, mas 1 coluna é opcional, depende dos dados (fields[].field2) existir ou não.
Em cada linha não há problema em verificar, mas como verificar o cabeçalho?
<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>
No momento eu uso uma função auxiliar instável "atribuir" que cria auxiliares.
{{#each fields}}
{{#if field2}}
{{assign "helperVar" "<th>Head 2 (optional)</th>"}}
{{/if}}
{{/each}}
Output with: {{{helperVar}}}
Mas isso não é uma boa solução e não posso usá-lo em #if.
Isso vai contra a premissa de modelos sem lógica e não acho que isso deva ser uma construção no nível da linguagem.
Acho que a abordagem recomendada aqui seria calcular esses dados em sua lógica de criação de contexto e passá-los para o modelo. Isso permite muito mais controle, pois você tem a linguagem javascript completa à sua disposição, em vez de qualquer subconjunto implementado na linguagem do modelo.
template({
fields: fields,
hasField2: _.any(fields, function(item) { return item.field2; })
});
Eu acho que isso seria um bom recurso, não para introduzir mais lógica no template, mas para passar variáveis específicas para aquele template.
Por exemplo, 2 dos meus modelos usam a mesma parcial. Eu gostaria de poder passar algumas variáveis para essa parcial a partir do nível do modelo, para que coisas diferentes sejam geradas para o modelo diferente dentro do escopo da parcial.
+1
+1
:+1:
:+1:
@kpdecker Podemos ter loops, instruções if e várias outras construções lógicas em modelos. Mas aparentemente atribuir uma variável é _muito_ lógica em templates? Eu realmente não entendo o raciocínio por trás dessa decisão quando os outros auxiliares padrão contêm muito mais lógica do que simplesmente ter a capacidade de atribuir uma variável.
+1
+1
+1
+1
Algo nesse sentido pode ser implementado usando parâmetros de bloco e está documentado aqui:
http://handlebarsjs.com/block_helpers.html#block -params
Como isso é feito em um namespace separado fora do contexto atual, ele fornece um comportamento mais consistente em relação à atribuição de contexto.
Comentários muito úteis
:+1:
@kpdecker Podemos ter loops, instruções if e várias outras construções lógicas em modelos. Mas aparentemente atribuir uma variável é _muito_ lógica em templates? Eu realmente não entendo o raciocínio por trás dessa decisão quando os outros auxiliares padrão contêm muito mais lógica do que simplesmente ter a capacidade de atribuir uma variável.