2011-10-06 10 views
10

tengo el siguiente modelo:defecto cadena principal de referencia sobre el cambio de propiedad

var Soq = Backbone.model.extend({ 
    default:{ 
     'name': 'something' 
     , 'parents': []  //array will be passed by reference to attributes hash on new object instantiation 
    } 
}); 

Soy nuevo en javascript y la columna vertebral pero mirando a la fuente Creo que lo que podría estar sucediendo es que cuando los atributos de este modelo consiguen el sistema de los valores predeterminados (backbone.js: 137) y el valor predeterminado es un objeto que se hace por referencia. Esto significa que cuando hago algo como esto:

var soq = new Soq; 
var parents = soq.get('parents'); 
parents.push('parent');    //changes defaults of the proto object 

var soq2 = new Soq; 
console.log(soq2.get('parents');); //will output ['parent'] 
console.log(soq2.defaults.parents); //will output ['parent'] 

Estoy entendiendo esto correctamente, y si es así cuál es la mejor manera de establecer los valores por defecto que son objetos sin hacerlos sujetos a cambio en cualquier momento una instancia de futuro hace referencia a ellos ?

Avísame si me consta algo o no lo entiendo bien. Gracias de antemano por tu tiempo.

Respuesta

27

Su propiedad de "padres" será la misma en cada instancia porque está configurada en el prototipo. En otras palabras, el mismo objeto se usará para configurar el modelo cuando se construya, por lo tanto obtendrá la misma referencia de la matriz.

En su lugar, desea crear un nuevo objeto predeterminado cada vez que se construye un nuevo modelo. Backbone le permite definir sus valores predeterminados como una función en su lugar:

defaults: function() { 
    return { 
     name: 'something', 
     parents: [] 
    }; 
} 
+0

Ok, genial, gracias por su ayuda! – Mitya

+1

Gracias, esto es genial. Estaba haciendo todo tipo de verificaciones molestas en la función 'initialize()' antes de ver esto. La solución parece obvia ahora :) – fiznool

Cuestiones relacionadas