2011-09-13 23 views
11

Usando Backbone.js Sé que es muy recomendable establecer la propiedad de un modelo usando el método set, y NO modificando directamente el attributes internal hash.backbone.js establece los atributos internos del modelo hash directamente

Sin embargo, aparte de no activar automáticamente el evento de "cambio", ¿qué otras contras o efectos colaterales existen al modificar el hash interno directamente?

El problema que estoy enfrentando es que mientras que el método set toma un objeto literal, necesito asignar el lado izquierdo usando una variable determinada en tiempo de ejecución. Gracias.

myModel.set({ 
    myProperty : myValue; //myProperty is a variable, so this is invalid syntax 
}) 

//vs 

myModel.attributes[myProperty] = myValue; //myProperty is a variable that can be evaluated 

Respuesta

15

Bueno, si nos fijamos en la annotated source code, usted encontrará que set hace mucho.

¿Qué pasa si Ampliada Backbone.Model con una función que lo hace por usted:

Backbone.Model.prototype.setByName = function(key, value, options) { 
    var setter = {}; 
    setter[key] = value; 
    this.set(setter, options); 
}; 

Entonces, sólo puede hacer lo que desee directamente en el modelo:

var model = new Backbone.Model(); 
model.setByName(myProperty, "bar"); 

que se siente como una mejor solución para mí.

Editar

Como @ earl3s señalaron, esto ya no es necesario en las versiones más recientes de la espina dorsal. Hoy puede llamar al model.set(myProperty, "bar") y hace lo que desea.

+1

Creo que su solución es brillante. ¡Esta función debería fusionarse en nuevas versiones de Backbone! Gracias también por señalar el código fuente anotado; tienes razón, debería haberlo visto en primer lugar. – fortuneRice

+0

¡agradable! He escrito este código una docena de veces y nunca pensé en convertirlo en un método. :) por cierto: no hay necesidad de usar _.extend para esto. 'Backbone.Model.prototype.setByName = function (...) {...}' hace lo mismo ... funcionalmente igual. solo una manera diferente de hacerlo. –

+0

@Derick Bailey: Gracioso ... pensé que '_.extend' tenía algunos conocimientos adicionales para extender prototipos ... no. Es realmente para extender cualquier objeto con una colección de cambios. Nada loco allí. Cambiar mi respuesta para reconocer eso. Gracias. –

7

En el annotated source code mencionado por Brian Genisio, puede leer las siguientes líneas: "Manejar tanto" clave ", valor y {clave: valor} - estilo de argumentos.". Así que solo puede usar las opciones model.set (myProperty, "bar"). Quizás hayan agregado esta característica después de la publicación de Brian Genisio ... no sé.

+0

Esta es la solución correcta. La funcionalidad ya existe en el método 'set'. – earl3s

Cuestiones relacionadas