Handlebars.js: Erro de análise com cada auxiliar: Esperando "ID", ficou indefinido

Criado em 29 jun. 2012  ·  6Comentários  ·  Fonte: handlebars-lang/handlebars.js

Recebo o seguinte erro ao tentar o exemplo nos documentos:

Erro não detectado: Erro de análise na linha 3:
{{#cada pessoas}} ------- ^
Esperando 'ID', obteve 'indefinido'

feature

Comentários muito úteis

OK, o problema é muito simples, na verdade, não está relacionado a caracteres não imprimíveis, mas meu mecanismo de modelagem do lado do servidor colocou um espaço antes}}.
O seguinte resolve o problema, embora eu não tenha certeza se o guiador deve ser corrigido para analisar {# cada pessoa}} corretamente.

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

Todos 6 comentários

@ustun , você precisará nos mostrar um pouco mais de código antes que possamos realmente depurar isso. Seria muito útil se você pudesse montar um jsfiddle para isso.

@wagenet Obrigado pela resposta rápida. O problema é que não consigo nem demonstrar, pois é o mesmo que o exemplo #cada simples na página principal. Se eu tentar no jsfiddle, ou mesmo no console do Chrome, inserindo o texto, funciona, mas por algum motivo, o texto retornado por html () falha. Estou me perguntando se de alguma forma ele está ficando confuso com as novas linhas.

Aqui está a sessão do console. Como você pode ver, se eu inserir o modelo manualmente, ele funciona.

template = $ ("# 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'

Agora tentando 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>"

Cortar a saída html () também não tem efeito.

Então,

  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 há alguns dados binários em meu modelo:

    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

Estes são os charcodes do modelo problemático:

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 = template ({"pessoas: ['foo', 'bar']});

Aqui está o jsfiddle:

http://jsfiddle.net/8nugY/

OK, o problema é muito simples, na verdade, não está relacionado a caracteres não imprimíveis, mas meu mecanismo de modelagem do lado do servidor colocou um espaço antes}}.
O seguinte resolve o problema, embora eu não tenha certeza se o guiador deve ser corrigido para analisar {# cada pessoa}} corretamente.

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

Parece uma codificação ruim versus um bug real.

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