2011-05-18 6 views
14

tengo dicho código:Backbone.js traen un problema (no se puede actualizar los datos inmediatamente)

var MyModel = Backbone.Model.extend(); 

var MyCollection = Backbone.Collection.extend({ 
    url: '/url/', 
    model: MyModel 
}); 
var coll = new MyCollection(); 

La web es correcta y vuelve JSON correcta. Pero si trato de utilizar el siguiente código:

$('#fetch').click(function(){ 
    coll.fetch(); 
    console.log(coll.toJSON()); 
}); 
  • que me muestra datos sólo después del segundo clic (http-respuesta en Firebug veo después de la primera). Parece que los datos no se actualizan a tiempo.

Si pongo cada declaración en un evento diferente, funciona correctamente. Pero necesito saber la duración de la colección de inmediato. ¿Como hacer esto?

Respuesta

24

Tenga en cuenta que fetch es una llamada asincrónica al servidor. Para hacer que su código funcione como se esperaba, crear una función que successBackbone.Collection puede llamar una vez que se refresca su contenido desde el servidor:

$('#fetch').click(function(){ 
    coll.fetch({ 
     succcess: function() { 
      console.log(coll.toJSON()); 
     } 
    });  
}); 

Obviamente aplicación no necesita realmente llamar console.log por lo que un mayor ejemplo del mundo real utilizaría el evento de la columna vertebral de unión como esta:

coll.bind('refresh', someFunction); 
coll.fetch(); 

Con este enfoque, la espina dorsal llamará someFunction cuando se actualiza la recolección. Esto es realmente útil, especialmente cuando someFunction es la función render de una vista a la que desea vincular su colección.

coll.bind('refresh', yourView.render); 
coll.fetch(); 
+0

cuando 'Actualizar' desencadena el evento? – Andrew

+1

Ese evento se dispara cuando la colección ha terminado de recibir datos del servidor. –

+0

Gracias Andrew :) –

6

A partir de la versión 0.5.0 Collection.refresh se renombró a Collection.reset.

Así que en respuesta de Andrew (que me pareció muy útil):

coll.bind('refresh', someFunction); 

convierte

coll.bind('reset', someFunction); 
Cuestiones relacionadas