故事: 我有很多需要設置的屬性。由於他們有相似之處,我選擇將inputbox作爲屬性名稱的一部分讀出該類。如何使用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
},
});
編輯:下面
兩個答案解決它。將這些屬性映射到一個對象並將其提供給Backbone。我還找到了另一種解決方案model.set()也可以接受一個數組,而不是一個對象。
model.set(customattribute, value, customattribute2, value2);
你想,當他們改變從HTML元素的值傳播到骨幹模型? – 2012-03-09 20:12:56
用戶將填寫輸入框或使用滑塊。當兩者的值改變時,我需要通過讀出DOM id來識別他所改變的200個輸入中的哪一個。使用inputbox/slider和DOM id $(e.currentTarget).parents('div'),attr('id')的值,我更新了模型,它將更新其他觀看這個模型的更改事件的視圖。 – Jareish 2012-03-09 20:21:33