Это мои первые несколько часов работы с Handlebars, так что я, возможно, что-то пропустил, но ...
С такими данными: {status: {"200": 4, "304": 10}} кажется, что нельзя получить доступ к этим записям со строковыми представлениями целых чисел в качестве ключей. Этот шаблон у меня не работает (с использованием пакета 1.0.3beta):
{{#with status}}
{{#if 200}} ОК: {{200}} {{/ if}}
{{/с участием}}
{{200}} приводит к ошибке синтаксического анализа "EXPECTING ID". То же самое происходит, когда шаблон содержит: {{"200"}}. Любопытно, что {{#if 200}} работает нормально.
В 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», как предлагается.
Самый полезный комментарий
полезно знать, что скобки помогают в качестве обходного пути, но я хотел указать, что такое поведение нарушает обратную совместимость с усами.
У меня были шаблоны усов, в которых я мог получить доступ к элементам массива по буквальным индексам, написав:
{{someArray.0}}
Однако, когда я попытался перенести свое приложение с усов на руль (при условии, что все шаблоны должны работать), я обнаружил множество ошибок.
`Ожидая 'ID', получил 'INTEGER' '
К счастью, изменив эти выражения на
{{someArray.[0]}}
исправил проблему. возможно, стоит немного расширить язык, чтобы поддержать эти эксперименты для совместимости с усами.
Спасибо