Câu chuyện: Tôi có nhiều thuộc tính cần được đặt. Vì chúng có điểm tương đồng, tôi chọn đọc lớp, hộp nhập liệu là một phần của tên thuộc tính.Cách đặt thuộc tính động trên mô hình với Backbone.js
Sự cố: Thuộc tính động của đối tượng có thể được đặt, giống như mảng liên kết. Vì vậy, tôi có thể làm
var customattribute = this.$el.parents('div').attr('id');
var value = $(e.currentTarget()).val();
this.model.attributes[customattribute] = value;
Nhưng điều này sẽ không kích hoạt sự kiện thay đổi của mô hình. Tôi có thể tự kích hoạt một sự kiện thay đổi, nhưng điều này sẽ không cập nhật this.model.changedAttributes(), tôi chỉ cần thiết lập thuộc tính đã thay đổi, không phải mọi thuộc tính.
Điều này tất nhiên không hoạt động hoặc:
this.model.set(customattribute: value);
Vì vậy, làm thế nào tôi sẽ xử lý vấn đề này?
Tôi có ALOT (200+) thuộc tính có thể được đặt, tôi không muốn tạo danh sách sự kiện riêng cho mỗi thuộc tính trừ khi đó là cách duy nhất.
Code:
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:
Hai câu trả lời dưới đây giải quyết nó. Ánh xạ các thuộc tính cho một đối tượng và đưa nó vào Backbone. Ngoài ra tôi tìm thấy một giải pháp khác. Thay vì một đối tượng, model.set() cũng chấp nhận một mảng.
model.set(customattribute, value, customattribute2, value2);
bạn đang cố gắng tuyên truyền các giá trị từ các phần tử HTML để mô hình xương sống khi họ thay đổi? –
Người dùng sẽ điền vào ô nhập hoặc sử dụng thanh trượt. Khi giá trị của một trong hai thay đổi, tôi sẽ cần xác định 200 đầu vào nào mà anh đã thay đổi bằng cách đọc ra DOM id. Sử dụng giá trị của inputbox/slider và DOM id $ (e.currentTarget) .parents ('div'). Attr ('id'), tôi cập nhật mô hình, sẽ cập nhật các chế độ xem khác, những người nghe sự kiện thay đổi của mô hình này . – Jareish