2012-03-09 14 views
15

Historia: Tengo un montón de propiedades que deben establecerse. Como tienen similitudes, elijo leer la clase de la que inputbox forma parte como nombre de propiedad.Cómo establecer una propiedad dinámica en un modelo con Backbone.js

Problema: Se puede establecer una propiedad dinámica de un objeto, como una matriz asociativa. Entonces podría hacer

var customattribute = this.$el.parents('div').attr('id'); 
var value = $(e.currentTarget()).val(); 

this.model.attributes[customattribute] = value; 

Pero esto no desencadenaría un evento de cambio del modelo. Podría activar manualmente un evento de cambio, pero esto no actualizaría this.model.changedAttributes(), necesito establecer solo el atributo modificado, no todos los atributos.

Por supuesto, esto no funciona bien:

this.model.set(customattribute: value); 

Entonces, ¿cómo habría que manejar este problema?

Tengo ALOT (200+) atributos que se pueden establecer, no me gustaría hacer eventlisteners separados para cada atributo a menos que sea la única manera.

Código:

var Display = Backbone.View.extend({ 
    className: 'display', 
    events: { 
     'slide .slider' : 'sliderHandler' 
    }, 
    initialize: function(){ 
     _.bindAll(this, 'render', 'sliderHandler','update'); 
     this.model.on('change',this.update, this); 
    }, 
    render: function(){ 
     this.$el.html(_.template(html, {})); 
     this.$('.slider').slider(); 

     return this; 
    }, 
    sliderHandler: function(e){ 
     var slider = $(e.currentTarget); 
     var property = slider.parents('div').attr('id'); 
     var value = slider.slider('value'); 

     this.model.attributes[property] = value;    
    }, 
    update: function(){ 
     console.log(this.model.changedAttributes()); 
     //get changed attribute + value here 

    }, 
}); 

Editar:

Las dos respuestas por debajo de lo resolvió. Asigne los atributos a un objeto y bríndelos a Backbone. También encontré otra solución. En lugar de un objeto, model.set() también acepta una matriz.

model.set(customattribute, value, customattribute2, value2); 
+0

¿Estás tratando de propagar los valores de los elementos HTML con el modelo de la columna vertebral cuando cambian? –

+0

Un usuario completará un cuadro de entrada o usar un control deslizante. Cuando el valor de cualquiera de los cambios cambie, tendré que identificar cuál de las 200 entradas cambió al leer el ID del DOM. Utilizando el valor de la barra de entrada/control deslizante y la ID DOM $ (e.currentTarget) .parents ('div'). Attr ('id'), actualizo el modelo, que actualizará otras vistas que escuchen el evento de cambio de este modelo . – Jareish

Respuesta

25

no estoy seguro de que entiendo completamente su problema, pero: Si desea actualizar un atributo, simplemente:

this.model.set({ 
    customattribute: value 
}); 

Si desea que el ajuste no desencadena un evento, podría pasar una opción silenciosa, así:

this.model.set({ 
    customattribute: value 
}, {silent:true}); 

Espero que lo ayude.

ACTUALIZADO:

Otra forma:

var map = {}; 
map[customattribute] = value; 
this.model.set(map); 
+0

el atributo se llamaría atributo personalizado. Por ejemplo, var customattribute = "test"; this.model.set ({customattribute: 12}); si intenta obtener el valor: this.model.get ("atributo personalizado"); obtendrás 12, si pruebas this.model.get ("prueba"); obtendrá indefinido, y no 12 – Jareish

+0

utilizando una matriz asociada, puede hacer lo que desee. Actualicé para darte un ejemplo. De nuevo, si no desea lanzar un evento, pase la opción: silent: true. – Aito

5

que tiene que hacer este

var attributeName = this.$el.parents('div').attr('id'); 
var value = $(e.currentTarget()).val(); 
var attribute = {}; 
attribute[attributeName] = value; 
this.model.set(attribute); 

si el atributo era "prueba" y 'valor' valor sería el mismo como

this.model.set({test: 'value'}); 

que es lo que distingue correctamente el atributo y se propaga a la vista gracias a un modelo de eventos de cambio

0

A partir de Backbone 0.9.0 (Jan. 30, 2012), model.set (source) acepta un clave, un valor , y un opciones objeto.

this.model.set(attributeName, value, { silent: true }); 

es equivalente a

var attr = {}; 
attr[attributeName] = value; 
this.model.set(attr, { silent: true }); 
Cuestiones relacionadas