No se puede acceder a la colección / modelos de Backbone.js desde la plantilla

Estoy luchando por pasar mi colección de modelos en Backbone.js a la plantilla. Cada vez que intento acceder a los modelos (es decir, this.collection.models) solo obtengo una matriz vacía aunque sé que la colección contiene dos modelos de tipo Contacto. Estoy seguro de que me estoy perdiendo algo básico aquí. ¿Cuál es la forma estándar de pasar modelos a plantillas de Backbone.js?

A continuación se muestran las definiciones de modelo, colección y vista (la vista real se llama desde una función de enrutador Backbone.js; el código fuente del enrutador no se incluye aquí por razones de brevedad):

var Contact = Backbone.Model.extend({
  urlRoot: '/contacts.json',
  idAttribute: '_id',
  parse: function(response) {
    return response;
  }
});

var Contacts = Backbone.Collection.extend({
  model: Contact,
  url: '/contacts.json',
  parse: function(response) {
    return response.data;
  }
});

var ListContactsView = Backbone.View.extend({
  el: $('#content'),
  template: _.template($('#list-contacts-tpl').html()),
  initialize: function() {
    this.collection = new Contacts();
    this.collection.fetch();
    this.render();
  },
  render: function() {
    console.log(this.collection);
    this.$el.html(this.template({ contacts: this.collection.models }));
  }
});

La plantilla se define de la siguiente manera:

<script id="list-contacts-tpl" type="text/template">
  <% console.log(contacts); %> 
</script>

preguntado el 22 de mayo de 12 a las 12:05

1 Respuestas

Si su código es realmente como se muestra en su pregunta, el problema es que está representando la vista antes que la fetch ha regresado, razón por la cual su colección está vacía. El fetch tarda en volver, pero estás llamando render inmediatamente después de llamar fetch.

Cualquiera llame render en el controlador de éxito de la fetch funcionar, o enlazar render de las personas acusadas injustamente llamadas reset evento de la colección.

contestado el 22 de mayo de 12 a las 13:05

Gracias por la rápida respuesta. Vincular el evento de reinicio a la colección funcionó. Sin embargo, para que funcione, tuve que vincular adicionalmente el método de renderización al objeto View usando _.bindAll() desde el método initialize() de la vista. - Benjen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.