Handlebars.js: Parse-Fehler bei jedem Helfer: "ID" erwartet, wurde nicht definiert

Erstellt am 29. Juni 2012  ·  6Kommentare  ·  Quelle: handlebars-lang/handlebars.js

Ich erhalte die folgende Fehlermeldung, wenn ich das Beispiel in den Dokumenten versuche:

Nicht abgefangener Fehler: Parse-Fehler in Zeile 3:
{{ #jede Person }} --------^
'ID' erwartet, 'undefiniert' erhalten

feature

Hilfreichster Kommentar

OK, das Problem ist eigentlich ziemlich einfach und bezieht sich nicht auf nicht druckende Zeichen, aber meine serverseitige Templating-Engine hat ein Leerzeichen vor }} gesetzt.
Das Folgende löst das Problem, obwohl ich nicht sicher bin, ob Lenker so korrigiert werden sollten, dass {# each people }} korrekt analysiert wird.

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

Alle 6 Kommentare

@ustun , Sie müssen uns etwas mehr Code zeigen, bevor wir dies wirklich richtig debuggen können. Es wäre sehr hilfreich, wenn Sie dafür eine jsfiddle zusammenstellen könnten.

@wagenet Danke für die schnelle Antwort. Das Problem ist, dass ich es nicht einmal demonstrieren kann, da es dasselbe ist wie das einfache #each-Beispiel auf der Hauptseite. Wenn ich es in jsfiddle oder sogar in der Chrome-Konsole versuche und den Text eingebe, funktioniert es, aber aus irgendeinem Grund schlägt der von html() zurückgegebene Text fehl. Ich frage mich, ob es irgendwie durch Zeilenumbrüche verwirrt wird.

Hier ist die Konsolensitzung. Wie Sie sehen, funktioniert es, wenn ich die Vorlage manuell eingebe.

Vorlage = $("#Personen-in-Kunden-Vorlage").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'

Jetzt manuell versuchen:

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

Auch das Trimmen der html()-Ausgabe hat keine Auswirkung.

So,

  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'

Es scheint, als ob in meiner Vorlage einige Binärdaten enthalten sind:

    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

Dies sind die Zeichencodes der problematischen Vorlage:

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="";

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

t = template({"people: ['foo','bar']});

Hier ist die jsfiddle:

http://jsfiddle.net/8nugY/

OK, das Problem ist eigentlich ziemlich einfach und bezieht sich nicht auf nicht druckende Zeichen, aber meine serverseitige Templating-Engine hat ein Leerzeichen vor }} gesetzt.
Das Folgende löst das Problem, obwohl ich nicht sicher bin, ob Lenker so korrigiert werden sollten, dass {# each people }} korrekt analysiert wird.

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

Scheint wie eine schlechte Kodierung im Vergleich zu einem tatsächlichen Fehler.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen