шаблон скелета / подчеркивания в формате усов, вызывающий ошибку символа # фунта / хеша? - PullRequest
6 голосов
/ 25 января 2012

Я использую шаблонизатор подчеркивания в Backbone с шаблонами форматирования усов.

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

"Uncaught SyntaxError: Unexpected token ILLEGAL"

и указывает на функцию шаблона подчеркивания в backtrace, которая довольно бесполезна, но в firebug я получаю более полезную ошибку, такую ​​как:

enter image description here

Предполагается, что хеш-символ '#' - это проблема, которая имеет смысл, поскольку я знаю, что усы работают нормально, поскольку во многих других частях проекта он используется хорошо, также я впервые использую символ хэша в моих шаблонах. Это похоже на проблему либо с функцией зацикливания, либо с настройками интерполяции / шаблона для подчеркивания.

Вот соответствующая часть моего шаблона:

<div class="thumblist thumblistleft" id="currentprojectslist">
    <div class="thumb-list-header">
         <h2>current projects</h2>
    </div>
    <div class="thumb-list-area">
        <ol>
        {{#worklist}}       <!----- LOOK HERE --->
            {{#current}}
              <li><a>{{title}}</a></li>
            {{/current}}
        {{/worklist}}
        </ol>
    </div>
</div>

и вот пример JSON (все отлично проверяется)

{blah blah blah lot in here before,"worklist":[{"thumb":"img/project-s.jpg","id":"340","title":"Test Project One","desc":"big load of content here","current":true}], and so on....}

Сначала я следовал этому примеру для справки: http://mustache.github.com/#demo

СЕЙЧАС ЗДЕСЬ, ГДЕ Я ДУМАЮ, ЧТО МОЖЕТ БЫТЬ:

underscore.js предлагает использовать это перед рендерингом шаблона усов:

_.templateSettings = {
     evaluate : /\{\[([\s\S]+?)\]\}/g,
     interpolate : /\{\{([\s\S]+?)\}\}/g
};

также:

interpolate : /\{\{(.+?)\}\}/g

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

Возможно ли даже зациклить? глядя на источник подчеркивания, я не уверен: http://documentcloud.github.com/underscore/docs/underscore.html#section-120

Большое спасибо

Ответы [ 3 ]

23 голосов
/ 05 декабря 2012

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

_.templateSettings = {
  evaluate:    /\{\{#([\s\S]+?)\}\}/g,            // {{# console.log("blah") }}
  interpolate: /\{\{[^#\{]([\s\S]+?)[^\}]\}\}/g,  // {{ title }}
  escape:      /\{\{\{([\s\S]+?)\}\}\}/g,         // {{{ title }}}
}

На самом деле это не работает так же, как усы: в шаблонах Underscore нет подходящих блоков,нет необходимости в закрывающем блоке {{/}}.Вам просто нужно сопоставить свои утверждения, как если бы вы использовали стандартные шаблоны Underscore.

7 голосов
/ 25 января 2012

Я публикую сообщения ради кого-либо еще, кто сталкивается с этой проблемой. После долгих поисков, но безрезультатно, я просмотрел источник underscore.js с тонкой зубчатой ​​гребенкой, и в основном вам нужно либо использовать синтаксис шаблонов подчеркивания, записать уродливые процессоры функций в ваш JSON, либо включить mustache.js в ваш источник и вызвать :

Mustache.render(mytemplate,mymodel)

и знак подчеркивания

_.template(..) function

Раздражает, но что угодно, надеюсь, это кому-то поможет

1 голос
/ 08 февраля 2013

Я не использую символ #, но у меня возникла похожая ошибка, когда я попытался использовать тройные усы {{{name}}} для неэкранированных значений с настройкой:

interpolate : /\{\{\{(.+?)\}\}\}/g,
escape : /\{\{(.+?)\}\}/g,

Если это причина, по которой вы пришли сюдаследующие настройки работают

interpolate : /\{\{\{(\s*\w+?\s*)\}\}\}/g,
escape : /\{\{(\s*\w+?\s*)\}\}(?!\})/g,

Я попробовал формат Макса, но у меня это не сработало, потому что у меня есть смесь выражений с двойными и тройными усами, и хотя тройное выражение работало нормально, он удалял символ изкаждый конец имени переменной в двойных усах, т.е. {{title}}, приводил к подчеркиванию при поиске переменной с именем itl

...