2011-03-10 15 views
68

En mi aplicación backbone.js, hay un Trips collection que contiene Trip models, que está trabajando con LocalStorage. Puedo llamar al Trips.create(form_attributes) para crear y guardar un viaje al Todos store.¿Qué eventos se desencadenan al llamar a fetch() en una colección Backbone.js?

La primera vez que se carga mi aplicación, me llaman Trips.fetch({ success: trips_fetch_success }) y trips_fetch_success recibe una respuesta que muestra la Trip models que el Trips collection bodegas.

He tratado de obligar refresh y change eventos al Trips collection, pero estos eventos no están siendo capturados, haciéndome creer que tenga una idea equivocada de que los acontecimientos desencadenantes Trips.fetch.

Mi pregunta: ¿qué eventos deberían activarse Trips.fetch? ¿Y los eventos activados en la colección o en cada uno de los Trip models individuales?

Respuesta

59

Collection.fetch() llamará a reset en caso de éxito, que a su vez desencadenará un evento de 'reinicio'. Cualquier suscriptor al evento de restablecimiento de colecciones debería recibir el evento.

La clave aquí es "en el éxito". Tuve este problema, solo para descubrir que la red troncal estaba tragando silenciosamente mis mensajes de error. Pasar de un controlador de errores que, al menos, los registros de console.log(), y ver lo que está pasando:

trips.fetch({error: function() { console.log(arguments); }}); 

(Nota: Las versiones antiguas de Backbone.js disparará "refresh" en lugar de "reset")

+4

Puede tener un controlador de errores jQuery ajax global para manejar errores de este tipo, generalmente relacionados con problemas de conectividad. – Julien

+9

A partir del backbone 0.5+, 'Collection # refresh' [ha sido renombrado] (http://documentcloud.github.com/backbone/#changelog) a' Collection # reset'. El evento también se renombra en consecuencia. – ejel

+1

Además, es útil saber que la devolución de llamada 'reset' tiene dos argumentos predeterminados' "reset" (colección, opciones) 'y se activa cuando los contenidos completos de la colección han sido reemplazados. –

52

Si está utilizando la columna vertebral 1.0, tendrá que pasar reset: verdad en la llamada fetch() a fin de obligar al evento de reinicio:

trips.fetch({reset: true}); 
+6

buen punto. Cuando deseo actualizar una vista basada en un modelo fetch(), me enlace a 'sync'. Eso es lo que se desencadena por defecto en 1.0. –

19

Como espina dorsal de 1,0, model.fetch() desencadena una 'sincronizar'. A eso es a lo que debes unirte.

fetch: function(options) { 
    options = options ? _.clone(options) : {}; 
    if (options.parse === void 0) options.parse = true; 
    var model = this; 
    var success = options.success; 
    options.success = function(resp) { 
    if (!model.set(model.parse(resp, options), options)) return false; 
    if (success) success(model, resp, options); 

    // HERE'S THE TRIGGER! 
    model.trigger('sync', model, resp, options); 

    }; 
    wrapError(this, options); 
    return this.sync('read', this, options); 
}, 
+2

ese es el código real de la fuente backbone.js, por cierto. Acabo de volver a leer mi comentario y me pregunté cuál era el código yo mismo ... Mejor ser explícito. –

Cuestiones relacionadas