2012-03-06 18 views
8

Tengo un modelo básico de red troncal, su atributo urlRoot está establecido y el destino correspondiente en el servidor devuelve una salida JSON correcta (cadena JSON y encabezado application/json).Buscar Backbone.js no configurando realmente los atributos

que llamo una zona de alcance de esta manera:

var athlete = new Athlete({ id: 1 }); 
athlete.fetch(); 

en este punto si añado un

console.log(athlete); 

puedo ver el modelo, y la inspección en Firebug que puede abrir el objeto de los atributos y ver todos los valores devueltos desde el servidor.

pero si lo hago a:

console.log(athlete.get('name')); 

me sale undefined (el nombre aparece en los atributos de la inspección DOM he mencionado anteriormente)

también haciendo un:

console.log(athlete.attributes); 

devuelve un objeto que contiene solo {id: 1} que es el argumento que aprobé al crear el modelo.

Si creo el modelo de la siguiente manera:

var athlete = new Athlete(<JSON string copypasted from the server response>); 

entonces todo funciona bien, los .get() devuelve el método lo que pido, y athlete.attributes muestra todos los valores.

¿Qué estoy haciendo mal?

Respuesta

18

fetch es asincrónico, lo que significa que los datos no estarán disponibles si llama inmediatamente console.log(athlete.get('name')) después de la búsqueda.

Use eventos para ser notificados cuando los datos están disponibles, por ejemplo

var athlete = new Athlete({id: 1}); 
athlete.on("change", function (model) { 
    console.log(model.get('name')); 
}); 
athlete.fetch(); 

o añadir una devolución de su ir a buscar

var athlete = new Athlete({ id: 1 }); 
athlete.fetch({ 
    success: function (model) { 
     console.log(model.get('name')); 
    } 
}); 

o tomar ventaja de la promesa devuelto por fetch:

athlete.fetch().then(function() { 
    console.log(athlete.get('name')); 
}); 
+0

Por supuesto ahora me doy cuenta de lo obvio que era, gracias por señalar :) –

1

Solo como un comentario rápido al usar eventos en este ejemplo. No funcionó con change en mi caso porque estos eventos se activan en cada cambio. Entonces sync hace el truco.

var athlete = new Athlete({id: 1}); 
athlete.on("sync", function (model) { 
    console.log(model.get('name')); 
}); 
athlete.fetch(); 
Cuestiones relacionadas