Estoy tratando de renderizar una colección Backbone.js como una lista select
usando una plantilla Underscore.js, y la lista no se está llenando. Se muestra el elemento select
, pero no hay options
.Rendering Backbone.js Colección como una lista de selección
He confirmado que puedo pasar propiedades individuales a mi plantilla y representarlas como elementos label
, por lo que el problema debe ser la forma en que trato de manejar la colección.
Aquí está mi código Backbone:
Rate = Backbone.Model.extend({
duration : null
});
Rates = Backbone.Collection.extend({
initialize: function (model, options) {
}
});
AppView = Backbone.View.extend({
el: $('#rate-editor-container'),
initialize: function() {
this.rates = new Rates(null, { view: this });
this.rates.add(new Rate ({ duration: "Not Set" }));
this.rates.add(new Rate ({ duration: "Weekly" }));
this.rates.add(new Rate ({ duration: "Monthly" }));
this.render();
},
render: function() {
var rate_select_template = _.template($("#rate_select_template").html(), {rates: this.rates, labelValue: 'Something' });
$('#rate-editor-container').html(rate_select_template);
},
});
var appview = new AppView();
Y mi plantilla:
<script type="text/template" id="rate_select_template">
<select id="rate-selector"></select>
<% _(rates).each(function(rate) { %>
<option value="<%= rate.duration %>"><%= rate.duration %></option>
<% }); %>
</script>
<div id="rate-editor-container"></div>
¿Alguna sugerencia?
Comprueba dos veces el valor de 'esto' en tu función de renderizado: no veo que lo vincules al objeto Backbone. Puedes hacerlo con _.bindAll (esto, 'render') en tu función de inicialización. –
Hmmm. Agregué eso justo arriba de 'this.render()' en mi extensión 'Backbone.View', pero no pareció hacer nada. Antes de publicar mi pregunta, hice 'console.log (this.rates)' y salió como 'child' con tres sub-objetos. Así que creo que estoy pasando un objeto de algún tipo con tres objetos anidados debajo, lo cual parece correcto. –
@Factor: 'delegateEvents' en las versiones recientes de Backbone realiza el enlace por sí mismo (busque' method = _.bind (método, esto); 'inside' delegateEvents' en la [fuente más reciente] (http://documentcloud.github.com/backbone/backbone.js)) por lo que ya no necesita el habitual baile '_.bindAll' para inicia tus métodos 'initialize' –