Ответ 1
У вас есть пара различных проблем.
- Ваш шаблон пытается поместить элементы
<option>
после<select>
, а не внутри него. Это приведет к недействительному HTML, и браузер будет уничтожать его после получения чего-либо из вашего шаблона. -
rates
- это коллекция Backbone, поэтому он уже имеет доступ к Underscoreeach
; обертывая его как_(rates)
, просто путает Underscore и предотвращает любые итерации. - Внутри итерации
rate
является экземпляром модели Backbone, поэтому он не будет иметь свойствоduration
, вы должны сказатьrate.get('duration')
.
Ваш шаблон должен выглядеть примерно так:
<script type="text/template" id="rate_select_template">
<select id="rate-selector">
<% rates.each(function(rate) { %>
<option value="<%= rate.get('duration') %>"><%= rate.get('duration') %></option>
<% }); %>
</select>
</script>
Демо: http://jsfiddle.net/ambiguous/AEqjn/
В качестве альтернативы вы можете просто исправить ошибку вложенности в шаблоне, чтобы создать допустимый HTML:
<script type="text/template" id="rate_select_template">
<select id="rate-selector">
<% _(rates).each(function(rate) { %>
<option value="<%= rate.duration %>"><%= rate.duration %></option>
<% }); %>
</select>
</script>
и используйте toJSON()
в своем представлении для подачи необработанных данных в ваш шаблон, а не в самой коллекции:
var rate_select_template = _.template($("#rate_select_template").html(), {
rates: this.rates.toJSON(),
labelValue: 'Something'
});
Демо: http://jsfiddle.net/ambiguous/VAxFW/
Я думаю, что последнее - это то, к чему вы стремились, поскольку это будет более стандартный подход к работе с шаблонами в Backbone.