Handlebars.js: kann keine ganze Zahl als ID verwenden

Erstellt am 27. Juni 2011  ·  10Kommentare  ·  Quelle: handlebars-lang/handlebars.js

Es sind meine ersten Stunden, in denen ich mit Lenkern arbeite, also habe ich vielleicht etwas verpasst, aber .....

Mit Daten wie diesen: {status: {"200": 4, "304": 10}} kann man anscheinend nicht auf diese Einträge mit Stringdarstellungen von ganzen Zahlen als Schlüssel zugreifen. Diese Vorlage funktioniert bei mir nicht (mit dem 1.0.3beta-Paket):

{{#mit Status}}
{{#if 200}} OK: {{ 200 }} {{/if}}
{{/mit}}

die {{ 200 }} führt zu einem Parse-Fehler "EXPECTING ID". Das gleiche passiert, wenn die Vorlage Folgendes enthält: {{ "200" }}. Seltsamerweise scheint {{#if 200}} gut zu funktionieren.

bug

Hilfreichster Kommentar

gut zu wissen, dass die Klammern als Workaround helfen, aber ich wollte darauf hinweisen, dass dieses Verhalten die Abwärtskompatibilität mit Schnurrbart unterbricht.

Ich hatte Schnurrbart-Vorlagen, in denen ich auf Array-Elemente über Literalindizes zugreifen würde, indem ich Folgendes schrieb:

{{someArray.0}}

Als ich jedoch versuchte, meine App von Schnurrbart auf Lenker zu migrieren (vorausgesetzt, die Vorlagen sollten alle funktionieren), hatte ich jede Menge Fehler

`Erwarte 'ID', habe 'INTEGER'``

Zum Glück ändern Sie diese Ausdrücke in expression

{{someArray.[0]}}

das Problem behoben. Vielleicht lohnt es sich, die Sprache ein wenig zu erweitern, um diese Ausdrücke für die Schnurrbart-Kompatibilität zu unterstützen.

Vielen Dank

Alle 10 Kommentare

In Handlebars werden Ganzzahlen als INTEGER tokenisiert. Sie können jede beliebige Zeichenfolge zum Laufen bringen, indem Sie sie in Klammern setzen:

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

gut zu wissen, dass die Klammern als Workaround helfen, aber ich wollte darauf hinweisen, dass dieses Verhalten die Abwärtskompatibilität mit Schnurrbart unterbricht.

Ich hatte Schnurrbart-Vorlagen, in denen ich auf Array-Elemente über Literalindizes zugreifen würde, indem ich Folgendes schrieb:

{{someArray.0}}

Als ich jedoch versuchte, meine App von Schnurrbart auf Lenker zu migrieren (vorausgesetzt, die Vorlagen sollten alle funktionieren), hatte ich jede Menge Fehler

`Erwarte 'ID', habe 'INTEGER'``

Zum Glück ändern Sie diese Ausdrücke in expression

{{someArray.[0]}}

das Problem behoben. Vielleicht lohnt es sich, die Sprache ein wenig zu erweitern, um diese Ausdrücke für die Schnurrbart-Kompatibilität zu unterstützen.

Vielen Dank

@santip Ich bin verwirrt. Moustache unterstützt überhaupt keine Pfade, also wie können Sie {{someArray.0}} in Moustache ausführen?

aww, mein Fehler, ok, ich habe tatsächlich hogan.js verwendet und wusste nicht, dass es auf Schnurrbart nicht unterstützt wird.

Übrigens, bei der Migration von hogan.js ist mir auch aufgefallen, dass das Sprudeln nicht so funktioniert wie in hogan (oder Schnurrbart):

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'

Es funktioniert, wenn ich ../ verwende, weshalb ich auf Lenker umgestiegen bin, aber ich dachte, es lohnt sich, auf die fehlende Kompatibilität dort hinzuweisen.

Außerdem habe ich gerade den Schnurrbart getestet und er scheint Pfade zu unterstützen

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

Ja, Schnurrbart unterstützt Pfade. Überprüfen Sie die # gepunkteten Namen in https://github.com/mustache/spec/blob/master/specs/sections.yml

Scheint, als hätte Schnurrbart Funktionen hinzugefügt. Ich bin mir nicht sicher, ob ich mich angemeldet habe, um die Moustache-Spezifikation für immer zu verfolgen :/

Es sieht nicht so aus, als ob die Moustache-Spezifikation das Verhalten für .<integer> . Ich könnte dies definitiv zum Laufen bringen, obwohl foo.[anything] Handlebars für Pfade ohne Kennung besser funktioniert.

Mein ursprünglicher Plan war "Wenn es ein gültiger Punktpfad in JS ist, funktioniert es in Lenkstangen".

Gibt es einen Grund, warum Sie die Pfadnotation .<integer> nicht unterstützen konnten?

Ich denke nicht, dass Sie das Bubbling unterstützen sollten, da es wahrscheinlich viele vorhandene Lenkervorlagen beschädigen würde, obwohl Sie wahrscheinlich die Dokumentation und die Website aktualisieren sollten, um über diese Inkompatibilitäten zu informieren, um den Leuten, die die Migration durchführen, einige Kopfschmerzen zu ersparen.

Ich bin darauf gestoßen, als ich versuchte, Bezeichner in der Form {{1}} , die in Moustache und Hogan gut kompilieren, aber Expecting 'ID', 'DATA', got 'NUMBER' in Handlebars werfen. Obwohl ich möchte, dass Ganzzahlen unterstützt werden, verstehe und unterstütze ich den Ansatz von Punktpfadsyntax zu verwenden.

Ich denke jedoch, dass die Dokumente dies widerspiegeln sollten. Sie stellen derzeit fest:

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

was ich für irreführend halte, da ganze Zahlen nicht gültig sind. Es ist viel klarer zu sagen: "Wenn es ein gültiger Punktpfad in JS ist, funktioniert er in Handlebars", wie vorgeschlagen.

http://handlebarsjs.com/expressions.html

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

snimavat picture snimavat  ·  5Kommentare

rizen picture rizen  ·  6Kommentare

fcpauldiaz picture fcpauldiaz  ·  4Kommentare

ustun picture ustun  ·  6Kommentare

rhariraman picture rhariraman  ·  5Kommentare