Как установить динамическое свойство в модели с помощью Backbone.js
История:
У меня есть много свойств, которые необходимо установить. Поскольку у них есть сходства, я выбираю для чтения класс, который является входным полем как имя свойства.
Проблема:
Динамическое свойство объекта можно задать так же, как ассоциативный массив. Поэтому я мог сделать
var customattribute = this.$el.parents('div').attr('id');
var value = $(e.currentTarget()).val();
this.model.attributes[customattribute] = value;
Но это не вызовет событие изменения модели. Я мог бы вручную инициировать событие изменения, но это не будет обновлять this.model.changedAttributes(), мне нужно установить только измененный атрибут, а не каждый атрибут.
Это, конечно, тоже не работает:
this.model.set(customattribute: value);
Итак, как бы я справился с этой проблемой?
У меня есть атрибуты ALOT (200+), которые можно установить, я бы не хотел создавать отдельные eventlisteners для каждого атрибута, если только это не единственный способ.
код:
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
},
});
Edit:
Два ответа ниже решили. Сопоставьте атрибуты с объектом и передайте его на Магистраль. Также я нашел другое решение. Вместо объекта model.set() также принимает массив.
model.set(customattribute, value, customattribute2, value2);
Ответы
Ответ 1
Я не уверен, что полностью понимаю вашу проблему, но:
Если вы хотите обновить атрибут, просто:
this.model.set({
customattribute: value
});
Если вы хотите, чтобы этот параметр не вызывал событие, вы можете передать тихий параметр, например:
this.model.set({
customattribute: value
}, {silent:true});
Надеюсь, это поможет вам.
ОБНОВЛЕНО
Другой способ:
var map = {};
map[customattribute] = value;
this.model.set(map);
Ответ 2
Вам нужно сделать это
var attributeName = this.$el.parents('div').attr('id');
var value = $(e.currentTarget()).val();
var attribute = {};
attribute[attributeName] = value;
this.model.set(attribute);
если атрибут был "test", а значение "value" было бы таким же, как
this.model.set({test: 'value'});
что является тем, что правильно устанавливает атрибут и распространяется на ваш взгляд, благодаря событию изменения модели
Ответ 3
От Backbone 0.9.0 (30 января 2012 г.), model.set
(источник) принимает ключ, значение и параметры.
this.model.set(attributeName, value, { silent: true });
эквивалентно
var attr = {};
attr[attributeName] = value;
this.model.set(attr, { silent: true });