Handlebars.js: Atribuir variáveis ​​no modelo

Criado em 29 mar. 2013  ·  11Comentários  ·  Fonte: handlebars-lang/handlebars.js

É 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.

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.

Todos 11 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ustun picture ustun  ·  6Comentários

stevenvachon picture stevenvachon  ·  7Comentários

morgondag picture morgondag  ·  5Comentários

nknapp picture nknapp  ·  3Comentários

snimavat picture snimavat  ·  5Comentários