Handlebars.js: не может использовать строку целого числа в качестве идентификатора

Созданный на 27 июн. 2011  ·  10Комментарии  ·  Источник: handlebars-lang/handlebars.js

Это мои первые несколько часов работы с Handlebars, так что я, возможно, что-то пропустил, но ...

С такими данными: {status: {"200": 4, "304": 10}} кажется, что нельзя получить доступ к этим записям со строковыми представлениями целых чисел в качестве ключей. Этот шаблон у меня не работает (с использованием пакета 1.0.3beta):

{{#with status}}
{{#if 200}} ОК: {{200}} {{/ if}}
{{/с участием}}

{{200}} приводит к ошибке синтаксического анализа "EXPECTING ID". То же самое происходит, когда шаблон содержит: {{"200"}}. Любопытно, что {{#if 200}} работает нормально.

Самый полезный комментарий

полезно знать, что скобки помогают в качестве обходного пути, но я хотел указать, что такое поведение нарушает обратную совместимость с усами.

У меня были шаблоны усов, в которых я мог получить доступ к элементам массива по буквальным индексам, написав:

{{someArray.0}}

Однако, когда я попытался перенести свое приложение с усов на руль (при условии, что все шаблоны должны работать), я обнаружил множество ошибок.

`Ожидая 'ID', получил 'INTEGER' '

К счастью, изменив эти выражения на

{{someArray.[0]}}

исправил проблему. возможно, стоит немного расширить язык, чтобы поддержать эти эксперименты для совместимости с усами.

Спасибо

Все 10 Комментарий

В Handlebars целые числа токенизируются как INTEGER. Вы можете заставить работать любую последовательность символов, заключив их в скобки:

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

полезно знать, что скобки помогают в качестве обходного пути, но я хотел указать, что такое поведение нарушает обратную совместимость с усами.

У меня были шаблоны усов, в которых я мог получить доступ к элементам массива по буквальным индексам, написав:

{{someArray.0}}

Однако, когда я попытался перенести свое приложение с усов на руль (при условии, что все шаблоны должны работать), я обнаружил множество ошибок.

`Ожидая 'ID', получил 'INTEGER' '

К счастью, изменив эти выражения на

{{someArray.[0]}}

исправил проблему. возможно, стоит немного расширить язык, чтобы поддержать эти эксперименты для совместимости с усами.

Спасибо

@santip Я запуталась. Moustache вообще не поддерживает пути, так как же вы можете использовать {{someArray.0}} в усах?

Ой, плохо, хорошо, я на самом деле использовал hogan.js и не знал, что он не поддерживается на усах.

кстати, при переходе с hogan.js я также заметил, что пузыри не работают, как в hogan (или усах):

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'

Он работает, когда я использую ../, поэтому я перешел на Handlebars, но я подумал, что стоит указать на отсутствие там совместимости.

Также я только что протестировал усы, и, похоже, они поддерживают пути.

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

Да, усы поддерживают дорожки. Проверьте # имена с точками в https://github.com/mustache/spec/blob/master/specs/sections.yml

Похоже, усы добавляли новых функций. Я не уверен, подписался ли я, чтобы навсегда отслеживать спецификацию усов: /

Не похоже, что спецификация Mustache описывает поведение .<integer> . Я определенно мог бы сделать эту работу, хотя foo.[anything] Handlebars лучше работает для путей без идентификатора.

Мой первоначальный план заключался в том, «если это действительный точечный путь в JS, он работает в Handlebars».

Есть ли причина, по которой вы не можете поддерживать нотацию пути .<integer> ?

Я не думаю, что вам следует поддерживать всплытие, потому что это, вероятно, нарушит многие существующие шаблоны ручек, хотя вам, вероятно, следует обновить документацию и сайт, чтобы сообщить об этих несовместимости, чтобы избавить людей от головной боли, выполняющих миграцию.

Я столкнулся с этим при попытке использовать идентификаторы в форме {{1}} , которые отлично компилируются в Mustache и Hogan, но бросают Expecting 'ID', 'DATA', got 'NUMBER' в Handlebars. Хотя я бы хотел, чтобы поддерживались целые числа, я полностью понимаю и поддерживаю подход @wycats, в котором используется только допустимый синтаксис точки пути JS.

Однако я думаю, что документы должны это отразить. В настоящее время они заявляют:

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

что, я думаю, вводит в заблуждение, поскольку целые числа недействительны. Гораздо яснее сказать, что «если это действительный точечный путь в JS, он работает в Handlebars», как предлагается.

http://handlebarsjs.com/expressions.html

Была ли эта страница полезной?
0 / 5 - 0 рейтинги