Handlebars.js: no se puede usar una cadena de números enteros como identificación

Creado en 27 jun. 2011  ·  10Comentarios  ·  Fuente: handlebars-lang/handlebars.js

Son mis primeras horas trabajando con Handlebars, así que puede que me haya perdido algo, pero .....

Con datos como este: {status: {"200": 4, "304": 10}} parece que no se puede acceder a esas entradas con representaciones de cadena de números enteros como claves. Esta plantilla no me funciona (usando el paquete 1.0.3beta):

{{#con estado}}
{{#if 200}} OK: {{200}} {{/ if}}
{{/con}}

el {{200}} da como resultado un error de análisis "ESPERANDO ID". Lo mismo sucede cuando la plantilla contiene: {{"200"}}. Curiosamente, el {{#if 200}} parece funcionar bien.

bug

Comentario más útil

Es bueno saber que los corchetes ayudan como solución, pero quería señalar que este comportamiento rompe la compatibilidad con el bigote.

Tenía plantillas de bigote donde accedería a elementos de matriz por índices literales escribiendo:

{{someArray.0}}

Sin embargo, cuando intenté migrar mi aplicación de bigote a manubrio (asumiendo que todas las plantillas deberían funcionar) me encontré con toneladas de errores

`` Esperando 'ID', obtuve 'INTEGER'``

Afortunadamente, cambiar esas expresiones a

{{someArray.[0]}}

solucionó el problema. tal vez valga la pena extender un poco el lenguaje para admitir estas expersiones para la compatibilidad con bigotes.

Gracias

Todos 10 comentarios

En Handlebars, los enteros se tokenizan como INTEGER. Puede hacer que funcione cualquier secuencia de caracteres rodeándolos entre paréntesis:

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

Es bueno saber que los corchetes ayudan como solución, pero quería señalar que este comportamiento rompe la compatibilidad con el bigote.

Tenía plantillas de bigote donde accedería a elementos de matriz por índices literales escribiendo:

{{someArray.0}}

Sin embargo, cuando intenté migrar mi aplicación de bigote a manubrio (asumiendo que todas las plantillas deberían funcionar) me encontré con toneladas de errores

`` Esperando 'ID', obtuve 'INTEGER'``

Afortunadamente, cambiar esas expresiones a

{{someArray.[0]}}

solucionó el problema. tal vez valga la pena extender un poco el lenguaje para admitir estas expersiones para la compatibilidad con bigotes.

Gracias

@santip Estoy confundido. Moustache no admite rutas en absoluto, entonces, ¿cómo podrías estar haciendo {{someArray.0}} en moustache?

aww, mi mal, ok, en realidad estaba usando hogan.js y no sabía que no era compatible con bigote.

Por cierto, al migrar de hogan.js también noté que el burbujeo no parece funcionar como lo hizo en hogan (o bigote):

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 cuando uso ../, que es la razón por la que cambié a Handlebars, pero pensé que valía la pena señalar la falta de compatibilidad allí.

Además, acabo de probar el bigote y parece admitir caminos.

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

Sí, el bigote soporta caminos. Verifique los # nombres con puntos en https://github.com/mustache/spec/blob/master/specs/sections.yml

Parece que el bigote ha estado agregando características. No estoy seguro de si me inscribí para realizar un seguimiento de la especificación de Moustache para siempre: /

No parece que la especificación Moustache describa el comportamiento de .<integer> . Definitivamente podría hacer que esto funcione, aunque foo.[anything] Handlebars funciona mejor para rutas sin identificador.

Mi plan original era "si es una ruta de puntos válida en JS, funciona en Handlebars".

¿Hay alguna razón por la que no pueda admitir la notación de ruta .<integer> ?

No creo que debas admitir el burbujeo porque probablemente rompería muchas plantillas de manillar existentes, aunque probablemente debas actualizar los documentos y el sitio para informar sobre estas incompatibilidades para evitar algunos dolores de cabeza a las personas que realizan la migración.

Me encontré con esto al intentar usar identificadores en la forma {{1}} , que se compilan bien en Moustache y Hogan pero arrojan Expecting 'ID', 'DATA', got 'NUMBER' en Handlebars. Aunque me gustaría que se admitieran números enteros, comprendo y apoyo @wycats de usar solo una sintaxis JS dot-path válida.

Sin embargo, creo que los documentos deberían reflejar esto. Actualmente afirman:

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

lo cual creo que es engañoso ya que los números enteros no son válidos. Es mucho más claro decir "si es una ruta de puntos válida en JS, funciona en Handlebars", como se sugiere.

http://handlebarsjs.com/expressions.html

¿Fue útil esta página
0 / 5 - 0 calificaciones