2012-03-28 16 views
11

Tengo una instancia de modelo, en la que configuré otra instancia de modelo, es decir, model.set('rsvp', new App.Rsvp).Backbone.js model.get() devolviendo 'undefined' aunque puedo ver los atributos en console.log

Cuando iterar sobre la colección para generar la lista de ellos en la vista, me sale undefined al llamar model.rsvp.get('attending').

Sin embargo, cuando hago una console.log(model.rsvp) me sale esto:

Rsvp 
_changing: false 
_escapedAttributes: Object 
_moreChanges: false 
_previousAttributes: Object 
_setting: false 
attributes: Object 
    attending: true 
    created_at: "2012-03-28T09:42:22-05:00" 
    event_id: 20 
    id: 12 
    updated_at: "2012-03-28T09:42:22-05:00" 
    user_id: 3 
__proto__: Object 
cid: "c53" 
id: 12 
__proto__: Rsvp 

Por lo tanto, parecería que no hay ningún problema con el objeto, sin embargo, el conseguir devuelve undefined.

Debo admitir que mi habilidad como Javascript es bastante débil. ¿Que me estoy perdiendo aqui?

Respuesta

18

console.log(Object) te puede engañar. No le mostrará el estado de Object en el momento de llamar al console.log.

Compruebe esto jsFiddle y abra la consola. Verá cómo el console.log muestra el estado del Object al final del script y no en el momento de la llamada console.log.

Para obtener información más confiable, llame al console.log con valores más simples.

(probado es Chrome, Firefox y Safari sobre OSX)

Lea esto para obtener información más detallada: Backbone.js Empty Array Attribute

+0

Tienes razón. Hubo un error con una llamada $ .when, pero no sabía que esa era la fuente del problema porque console.log se veía bien. Al parecer no estaba bien. Gracias! – MysteriousFist

0

En teoría, lo que está haciendo debería funcionar, pero probablemente no sea una buena idea eludir atributos y almacenar propiedades directamente en las instancias del modelo. Aquí hay un jsfiddle that shows it works in concept. Supongo que la instancia de su modelo se recreará a partir de los datos de origen a través del fetch en otro lugar de su código, por lo que la propiedad model.rsvp desaparece. Eso o model no es la misma instancia que crees que es.

+0

Inicialmente intentado usar .set en primer lugar, con el mismo resultado. Y los 'console.log's están de regreso. Entonces muestra la instancia y luego muestra indefinido cuando trato de obtener el atributo. Así que no veo cómo se restablecería durante ese período. – MysteriousFist

0

model.rsvp = foo; (permite llamar a este código de bit # 1), que es lo que es equivalente model['rsvp'] = foo; no es la igual que model.set({'rsvp':foo}); (bit de código n. ° 2). Si desea agregar otra instancia de modelo foo (u otro objeto o valor) en una instancia de modelo model, use el código bit # 1 o su equivalente. Si desea agregar un par de valores de atributo a una instancia modelo que eventualmente podría estar almacenada de forma permanente en alguna parte, use el código bit # 2. Del mismo modo, si sólo vas a tener model.rsvp define si se ha utilizado o model.rsvp = foo;model['rsvp'] = foo;

Cuestiones relacionadas