Как печатать массив в шаблоне underscore.js?
Я использую underscore.js templating library, и я не уверен, как использовать логику внутри шаблона. например, я хотел бы напечатать массив тегов в шаблоне. Каков наилучший подход для этого?
JavaScript:
bunny_data = {
name: "sprinkles",
age: 1,
tags: ['fuzzy','wuzzy']
};
bunny_view = $("#bunny-template").html();
$(body).append(_.template(bunny_view,bunny_data));
Шаблон:
<script type='text/template'>
<div>
<h5><% = name %></h5>
<ul class='tag-list'>
<!-- How do I print the tags here? -->
</ul>
</div>
</script>
Ответы
Ответ 1
Вам не нужно инкапсулировать bunny_data
, как предлагает @Ken, вы были на правильном пути. Независимо от того, хотите ли вы вызывать функции _.
или просто использовать простые конструкции Javascript, зависит от вас, но в шаблонах Underscore нет встроенных потоковых конструкций, чтобы вы просто вставляли код (вы можете посмотреть в eco или Mustache или что-то в этом случае).
Мой пример выглядит так (почти так же, как и вы):
<script type='text/template' id="bunny-template">
<div>
<h5><%= name %></h5>
<ul>
<% for(var tag in tags) { %>
<li><%= tags[tag] %></li>
<% } %>
</ul>
</div>
</script>
со следующим Javascript:
bunny_data = {
name: "sprinkles",
age: 1,
tags: ['fuzzy','wuzzy']
};
bunny_view = $("#bunny-template").html();
$(body).append(_.template(bunny_view, bunny_data));
Вы можете проверить, что он работает здесь.
(В личной заметке о предпочтениях я являюсь тяжелым пользователем всех Underscore, за исключением шаблонов по этой причине, мне не нравится размер кода, который вы должны вставить в них, если у вас есть более сложный случай использования).
Ответ 2
Похоже, что вы не устанавливаете bunny_data
правильно в свой JavaScript.
Вместо:
$(body).append(_.template(bunny_view,bunny_data));
Try:
$(body).append(_.template(bunny_view, { bunny_data: bunny_data }));
Распечатайте данные в своем шаблоне (обратите внимание, что я удалил пробел после% in <%= name %>
):
<script type='text/template'>
<div>
<h5><%= name %></h5>
<ul class='tag-list'>
<% _.each(bunny_data, function(bd) { %>
<li><%= bd.name %></li>
...
<% }); %>
</ul>
</div>
</script>
Надеюсь, это поможет.
Ответ 3
Также join
выполнит трюк, поэтому в html у вас будет
<ul>
<li><%= tags.join('</li><li>') %></li>
</ul>
Посмотрите на jsFiddle.