Handlebars.js: não pode usar string de inteiro como id

Criado em 27 jun. 2011  ·  10Comentários  ·  Fonte: handlebars-lang/handlebars.js

São minhas primeiras horas de trabalho com Guidão, então posso ter perdido algo, mas ...

Com dados como este: {status: {"200": 4, "304": 10}}, parece que não se pode acessar essas entradas com representações de string de inteiros como chaves. Este modelo não funciona para mim (usando o pacote 1.0.3beta):

{{#with status}}
{{#if 200}} OK: {{200}} {{/ if}}
{{/com}}

o {{200}} resulta em um erro de análise "EXPECTING ID". O mesmo acontece quando o modelo contém: {{"200"}}. Curiosamente, o {{#if 200}} parece funcionar bem.

bug

Comentários muito úteis

É bom saber que os colchetes ajudam como uma solução alternativa, mas eu gostaria de salientar que esse comportamento quebra a compatibilidade retroativa com o bigode.

Eu tinha modelos de bigode nos quais acessava os elementos da matriz por índices literais, escrevendo:

{{someArray.0}}

No entanto, quando tentei migrar meu aplicativo do bigode para o guidão (presumindo que todos os modelos deveriam funcionar), me deparei com muitos erros

`Esperando 'ID', obteve 'INTEGER'``

Felizmente, mudar essas expressões para

{{someArray.[0]}}

corrigiu o problema. talvez valha a pena estender um pouco a linguagem para suportar essa expansão para compatibilidade do bigode.

Obrigado

Todos 10 comentários

Em Handlebars, inteiros são tokenizados como INTEGER. Você pode fazer qualquer sequência de caracteres funcionar colocando-os entre colchetes:

{{#with status}}
  {{#if [200] }} OK: {{ [200] }} {{/if}}
{{/with}}

É bom saber que os colchetes ajudam como uma solução alternativa, mas eu gostaria de salientar que esse comportamento quebra a compatibilidade retroativa com o bigode.

Eu tinha modelos de bigode nos quais acessava os elementos da matriz por índices literais, escrevendo:

{{someArray.0}}

No entanto, quando tentei migrar meu aplicativo do bigode para o guidão (presumindo que todos os modelos deveriam funcionar), me deparei com muitos erros

`Esperando 'ID', obteve 'INTEGER'``

Felizmente, mudar essas expressões para

{{someArray.[0]}}

corrigiu o problema. talvez valha a pena estender um pouco a linguagem para suportar essa expansão para compatibilidade do bigode.

Obrigado

@santip , estou confuso. O bigode não suporta caminhos, então como você poderia estar fazendo {{someArray.0}} no bigode?

aww, meu mal, ok, eu estava usando hogan.js e não sabia que não era compatível com bigode.

aliás, ao migrar do hogan.js, também percebi que o bubbling não parece funcionar tão bem como no hogan (ou bigode):

Handlebars.compile('aaa {{a}} {{#b}}{{c}}{{d}}{{/b}}')({a:1, b:[{c:2}], d:3}) == 'aaa 1 2'

Hogan.compile('aaa {{a}} {{#b}}{{c}}{{d}}{{/b}}').render({a:1, b:[{c:2}], d:3}) == 'aaa 1 23'

Mustache.render('aaa {{a}} {{#b}}{{c}}{{d}}{{/b}}', {a:1, b:[{c:2}], d:3}) == 'aaa 1 23'

Funciona quando utilizo ../ razão pela qual mudei para Guiador mas achei que valia a pena apontar a falta de compatibilidade aí.

Além disso, acabei de testar o bigode e parece suportar caminhos

Mustache.render('aaa {{a}} {{b.c}}', {a:1, b:{c:2}, d:3}) == 'aaa 1 2'

Sim, o bigode oferece suporte a caminhos. Verifique os # nomes pontilhados em https://github.com/mustache/spec/blob/master/specs/sections.yml

Parece que o bigode está adicionando recursos. Não tenho certeza se me inscrevi para rastrear as especificações do Mustache para sempre: /

Não parece que a especificação do Mustache descreve o comportamento de .<integer> . Eu definitivamente poderia fazer isso funcionar, embora foo.[anything] guiador funcione melhor para caminhos não identificadores.

Meu plano original era "se for um caminho de ponto válido em JS, funciona em barras de guia".

Existe alguma razão pela qual você não pode suportar a notação de caminho .<integer> ?

Não acho que você deva oferecer suporte ao bubbling porque provavelmente quebraria muitos modelos de guidão existentes, embora você provavelmente deva atualizar a documentação e o site para informar sobre essas incompatibilidades para evitar dores de cabeça para quem está fazendo a migração.

Eu encontrei isso ao tentar usar identificadores na forma {{1}} , que compilam bem em Bigode e Hogan, mas jogam Expecting 'ID', 'DATA', got 'NUMBER' em barras de guia. Embora eu gostaria que inteiros fossem suportados, eu entendo totalmente e apoio a abordagem @wycats de usar apenas sintaxe de caminho de ponto JS válida.

No entanto, acho que os documentos devem refletir isso. Eles atualmente afirmam:

Identifiers may be any unicode character except for the following:
Whitespace ! " # % & ' ( ) * + , . / ; < = > @ [ \ ] ^ ` { | } ~

o que eu acho enganoso, pois os inteiros não são válidos. É muito mais claro dizer "se for um caminho de ponto válido em JS, funciona em Handlebars", como sugerido.

http://handlebarsjs.com/expressions.html

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

Questões relacionadas

jasonh-brimar picture jasonh-brimar  ·  6Comentários

stevenvachon picture stevenvachon  ·  7Comentários

nknapp picture nknapp  ·  3Comentários

novwhisky picture novwhisky  ·  4Comentários

amirzandi picture amirzandi  ·  7Comentários