Handlebars.js: Error de análisis con cada ayudante: esperando "ID", no está definido

Creado en 29 jun. 2012  ·  6Comentarios  ·  Fuente: handlebars-lang/handlebars.js

Recibo el siguiente error al intentar el ejemplo en los documentos:

Error no detectado: error de análisis en la línea 3:
{{ #cada persona }} ------- ^
Esperando 'ID', se puso 'indefinido'

feature

Comentario más útil

De acuerdo, el problema es bastante simple en realidad, no está relacionado con los caracteres que no son de impresión, pero mi motor de plantillas del lado del servidor puso un espacio antes de}}.
Lo siguiente resuelve el problema, aunque no estoy seguro de si los manillares deben arreglarse para analizar {# cada persona}} correctamente.

      source = $("#people-in-clients-template").html();
      source = source.replace(/ }}/g, "}}");
      source = source.replace(/{{ /g, "{{");

Todos 6 comentarios

@ustun ,

@wagenet Gracias por la rápida respuesta. El problema es que ni siquiera puedo demostrarlo, ya que es lo mismo que el ejemplo simple de #each en la página principal. Si lo intento en jsfiddle, o incluso en la consola de Chrome, ingresando el texto, funciona, pero por alguna razón, el texto devuelto por html () falla. Me pregunto si de alguna manera se está confundiendo con las nuevas líneas.

Aquí está la sesión de la consola. Como puede ver, si ingreso la plantilla manualmente, funciona.

template = $ ("# personas-en-clientes-plantilla"). html ()
"

{{ #each people }}
<li>{{ this }}</li>
{{ /each }}

"
t = Handlebars.compile(template);
function (context, options) {
    if (!compiled) {
      compiled = compile();
    }
    return compiled.call(this, context, options);
  }
t({"people": ['foo','bar']})
Error: Parse error on line 3: {{ #each people }}<li> ---^ Expecting 'ID', got 'undefined'

Ahora intentando manualmente:

template = "{{#each people }}<li>{{ this}}</li>{{/each}}"
"{{#each people }}<li>{{ this}}</li>{{/each}}"
t = Handlebars.compile(template);
function (context, options) {
    if (!compiled) {
      compiled = compile();
    }
    return compiled.call(this, context, options);
  }
t({"people": ['foo','bar']})
"<li>foo</li><li>bar</li>"

Recortar la salida html () tampoco tiene ningún efecto.

Entonces,

  template = $.trim($("#people-in-clients-template").html())
"

{{ #each people }}
<li>{{ this }}</li>
{{ /each }}

"
t = Handlebars.compile(template);
function (context, options) {
    if (!compiled) {
      compiled = compile();
    }
    return compiled.call(this, context, options);
  }
t({"people": ['foo','bar']})
Error: Parse error on line 3: {{ #each people }}<li> ---^ Expecting 'ID', got 'undefined'

Parece que hay algunos datos binarios en mi plantilla:

    template = "{{#each people }}<li>{{ this}}</li>{{/each}}"
"{{#each people }}<li>{{ this}}</li>{{/each}}"
/[\x00-\x1F]/.test(template)
false
template = $("#people-in-clients-template").html()
"

{{ #each people }}
<li>{{ this }}</li>
{{ /each }}

"
/[\x00-\x1F]/.test(template)
true

Estos son los códigos de caracteres de la plantilla problemática:

a = [10, 10, 123, 123, 32, 35, 101, 97, 99, 104, 32, 112, 101, 111, 112, 108, 101, 32, 125, 125, 10, 123, 123, 32 , 116, 104, 105, 115, 32, 125, 125, 10, 123, 123, 32, 47, 101, 97, 99, 104, 32, 125, 125, 10, 10]

b = "";

para (i = 0; i <a.length; i ++) {
b + = String.fromCharCode (a [i]);
}

t = plantilla ({"gente: ['foo', 'bar']});

Aquí está el jsfiddle:

http://jsfiddle.net/8nugY/

De acuerdo, el problema es bastante simple en realidad, no está relacionado con los caracteres que no son de impresión, pero mi motor de plantillas del lado del servidor puso un espacio antes de}}.
Lo siguiente resuelve el problema, aunque no estoy seguro de si los manillares deben arreglarse para analizar {# cada persona}} correctamente.

      source = $("#people-in-clients-template").html();
      source = source.replace(/ }}/g, "}}");
      source = source.replace(/{{ /g, "{{");

Parece una mala codificación frente a un error real.

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