Как оценить функции 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,
};
Другие вопросы по тегам