Использование циклов в шаблонах магистрали/подчёркивания
У меня есть шаблон backbone.js/underscore.js, который я загружаю в представлении позвоночника для рендеринга. В представлении передается модель, содержащая массив posts
объектов (который я называю post
в шаблоне).
Проблема. Когда я пытаюсь выполнить цикл всех элементов массива posts
, я получаю сообщение об ошибке Uncaught SyntaxError: Unexpected token )
и ссылается на строку в базовой системе. Код вида template: _.template( $('#tpl_SetView').html() )
.
Я неправильно делаю цикл, который вызывает эту ошибку?
Шаблонный код
<script type="text/template" id="tpl_SetView">
<div class="row_4">
<div class="photo_container">
<div class="set_cover">
<img src="/<%= posts[0].thumb_subpath %><%= posts[0].img_filename %>" width=240 />
</div>
<div class="set_thumbs">
<%= _.each(posts, function(post) { %>
<img src="<%= post.thumb_subpath %><%= posts.img_filename %>" width=55 />
<%= }); %>
</div>
</div>
</div>
</script>
Ответы
Ответ 1
Чтобы эхо использовать переменную, используйте <%= %>
, но для разбора кода javaScript просто используйте <% %>
.
Например:
// In your Backbone View
var posts = {"posts": this.model.toJSON()};
var template = _.template($("#tpl_SetView").html(), posts);
// In your template
<div class="row_4">
<div class="photo_container">
<div class="set_cover">
<img src="/<%= _.escape(posts[0].thumb_subpath) %><%= _.escape(posts[0].img_filename) %>" width=240 />
</div>
<div class="set_thumbs">
<% _.each(posts, function(post){ %>
<img src="<%= _.escape(post.thumb_subpath) %><%= _.escape(posts.img_filename) %>" width=55 />
<% }); %>
</div>
</div>
</div>
Ответ 2
Я думаю, вы обнаружите, что проблема в этих строках:
<%= _.each(posts, function(post) { %>
<img src="<%= post.thumb_subpath %><%= posts.img_filename %>" width=55 />
<%= }); %>
Из моего воспоминания о том, что подчеркивание делает для оценки шаблонов, эти строки не имеют большого смысла. Каждый элемент <% =..% > оценивается отдельно, то есть они должны быть полными оценочными выражениями, а не частичными функциональными блоками.
Править: На самом деле, Джеймс прав. <%..% > может быть определен отдельно (все сводится к большой строке javascript в конце). Он экранирован и интерполированные выражения, которые должны быть отдельными выражениями.
Edit II: Несмотря на это, в контексте оценки я думаю, что использование функционального блока все равно создало бы строку javascript для bizzare, которая может не оцениваться так, как предполагалось... Мне пришлось бы об этом подумать. Возможно, все будет хорошо.