Как оценить функции JavaScript в подчеркиваниях с усами?
Я хочу сделать что-то вроде этого:
<script id="tmpl-books" type="text/template">
<ul>
<% for (var i = 0; i < books.length; i++) { %>
<% var book = books[i]; %>
<li>
<em><%= book.title %></em> by <%= book.author %>
</li>
<% } %>
</ul>
</script>
в моем коде, но я использую JSP, поэтому я должен использовать нотацию {{ }}, но когда я делаю это, {{ for(var... }} не работает.
<script id="tmpl-books" type="text/template">
<ul>
{{ for (var i = 0; i < books.length; i++) { }}
<% var book = books[i]; %>
<li>
<em>{{= book.title }}</em> by {{ book.author }}
</li>
{{ } }}
</ul>
</script>
Как мне этого добиться?
2 ответа
Шаблоны подчеркивания имеют три различных регулярных выражения:
Определите интерполированное регулярное выражение для сопоставления выражений, которые должны быть дословно интерполированы, escape- регулярное выражение для сопоставления выражений, которые должны быть вставлены после экранирования HTML, и регулярное выражение для сопоставления выражений, которые должны оцениваться без вставки в результирующую строку.
Если вы хотите использовать разделители Handlebars-ish, вам нужно определить все три, а не только interpolate
регулярное выражение:
_.templateSettings = {
evaluate: /\{\{(.+?)\}\}/g,
interpolate: /\{\{=(.+?)\}\}/g,
escape: /\{\{-(.+?)\}\}/g
};
Также обратите внимание, что interpolate
а также escape
регулярные выражения должны соответствовать вещам, которые evaluate
не из- за порядка, в котором применяются регулярные выражения.
С этими настройками шаблона, такой шаблон:
<script id="tmpl-books" type="text/template">
<ul>
{{ for (var i = 0; i < books.length; i++) { }}
{{ var book = books[i]; }}
<li>
<em>{{= book.title }}</em> by {{= book.author }}
</li>
{{ } }}
</ul>
</script>
должно сработать. Обратите внимание на изменение от {{ book.author }}
в {{= book.author }}
так как вы интерполируете book.author
, не оценивая это.
Насколько я знаю, лучший способ - переопределить три регулярных выражения, как это:
_.templateSettings.evaluate = /\{\{(.+?)\}\}/g;
_.templateSettings.interpolate = /\{\{=(.+?)\}\}/g;
_.templateSettings.escape = /\{\{-(.+?)\}\}/g;
без замены всего объекта
_.templateSettings
как это:
_.templateSettings = {
evaluate: /\{\{(.+?)\}\}/g,
interpolate: /\{\{=(.+?)\}\}/g,
escape: /\{\{-(.+?)\}\}/g,
};