Я знаю, что я опоздал на беседу на 3 года, но ни один из этих ответов вообще не относится к ситуации, которая была у меня в моем последнем проекте.И поскольку то, как я изначально думал о том, чтобы сделать это, в конечном итоге сработало, я решил опубликовать его на тот случай, если кто-то захочет на самом деле вложить шаблоны underscore.js, как говорится в заголовке этого вопроса.
Мои требованиябыли в основном:
1) Если в шаблоне есть динамические части, они должны быть в состоянии визуализировать себя индивидуально - без необходимости повторной визуализации всего шаблона с обновленными данными.
2) Динамические части не нужно разбивать на свои собственные шаблоны на том же уровне, что и родительский шаблон;скорее, должна быть своего рода иерархия шаблонов - шаблон, объявляющий все необходимые суб-шаблоны для себя.
Концепция вложенных шаблонов в Underscore.js такая же, как в PHP (дляпример).Следующий код является примером «эхо PHP»:
<?php echo '<?php echo $var_unknown_until_runtime; ?>'; ?>
Хотя этот вложенный синтаксис может быть очень запутанным и запутанным, идея проста:
Эхо-код, который будетзначения эха позже.
Это относится и к шаблонам Underscore.js.
Пример
Код будет выглядеть следующим образом:
<script type="text/template" id="outer-tpl">
<%= value %>
<script type="text/template" id="inner-tpl">
<%= '<%= value %\>' %> <!-- NOTE how the inner '>' is escaped ('\>') -->
<%= "</script\>" %> <!-- NOTE same thing -->
</script>
Давайте немного разберемся с этим.Строка с первым NOTE
является нашей ключевой строкой здесь.Обычно, когда Underscore компилирует этот шаблон, можно ожидать, что значение value
будет напечатано как во внешнем, так и во внутреннем шаблонах.Чтобы предотвратить это, мы сделали несколько вещей:
1) Превратим вложенный оператор подчеркивания в строку.
2) Интерполируем эту строку (<%= "string here" %>
).
3) Избегать закрывающего >
во вложенном выражении подчеркивания (\>
).Это не позволяет регулярному выражению Underscore сопоставить это с открывающим тегом из шага 2 (<%=
).Когда эта строка повторяется, escape-символ будет удален, и %>
будет готов для интерпретации Underscore на следующем проходе.
То же самое происходит во втором NOTE
в нашемПример не позволяет браузеру завершить первый тег script
.Вложенные теги script
технически не допускаются, поэтому браузер ищет первую последовательность символов: </script>
и затем завершает выполнение скрипта.Это останавливает браузер от распознавания этой последовательности.
Более подробный пример см. В этом JSFiddle .
Отказ от ответственности
Я не одобряю это как лучший способ сделать что-то подобное.В конце концов, это очень хакерский.Хотя ответ @John z нарушает мое первое требование, которое для меня было неприемлемым, другой вариант разделения динамических частей шаблона на их собственные шаблоны может оказаться более простым.Это просто менее организовано.
Расположение всех этих вложенных тегов script
в вашей DOM может быть трудно отследить (так как вложенные теги script
будут динамически внедряться в DOM, когда и где бы вы ни находилисьвставить внешний шаблон).Риск дублирования высок и может быть раздражающим в обслуживании.
Сложность вложения шаблонов резко возрастает для каждого уровня вложения (чтобы вложить шаблон во вложенный шаблон, вам придется снова избегать всего, так далее...).Скрипка включает пример этого.