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);
¿Estás tratando de propagar los valores de los elementos HTML con el modelo de la columna vertebral cuando cambian? –
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