шаблон backbone/underscore в формате усов, вызывающий ошибку в символе # pound/hash?

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

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

"Uncaught SyntaxError: Unexpected token ILLEGAL"

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

введите здесь описание изображения

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

Вот соответствующий фрагмент моего шаблона:

<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

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


person Alex    schedule 25.01.2012    source источник
comment
Шаблон /\{\{([\s\S]+?)\}\}/g будет соответствовать {{#foo}} и захватить #foo. Вы можете избежать захвата хэша, используя /\{\{#?([\s\S]+?)\}\}/g, хотя я думаю, что это вызовет другие проблемы.   -  person Qtax    schedule 25.01.2012
comment
тебе когда-нибудь удавалось так зацикливаться? Я бы очень хотел, в подчеркивании очень раздражает писать простое условие if для нескольких строк оценки, чтобы проверить, присутствует ли флаг в моем JSON.   -  person Daniel    schedule 03.02.2012
comment
эй, к сожалению, подчеркивание не будет делать это изначально, вы должны включить mustache.js и сделать mustache.render, как показано ниже.. Это действительно раздражает, я согласен   -  person Alex    schedule 03.02.2012


Ответы (3)


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

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

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

person Max Wheeler    schedule 05.12.2012
comment
Обратите внимание, что с приведенным выше синтаксисом вы должны убедиться, что между вашим выражением и {{ }} есть пробел. Пример: {{ test }} будет работать, {{test}} — нет. - person Niyaz; 03.02.2016

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

Mustache.render(mytemplate,mymodel)

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

_.template(..) function

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

person Alex    schedule 25.01.2012

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

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

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

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

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

person Steve B.    schedule 08.02.2013
comment
Я пришел сюда за исходным вопросом, следил за ответами, и это регулярное выражение сработало для меня, спасибо! - person Dr Rob Lang; 23.05.2013
comment
Если кто-то столкнется с этим: {{title}} привело к подчеркиванию при поиске переменной с именем itl, что на самом деле является тем, на что Нияз указал ниже вопроса Макса: добавьте пробелы между выражением и фигурными скобками, и это будет работать. Значит вместо {{title}} нужно написать {{ title }}. - person shaedrich; 13.08.2020