2012-03-09 32 views
15

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); 
+0

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? –

+0

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

Trả lời

25

Tôi không chắc rằng tôi hoàn toàn hiểu được vấn đề của bạn, nhưng: Nếu bạn muốn cập nhật một thuộc tính, chỉ cần:

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

Nếu bạn muốn rằng các thiết lập không kích hoạt một sự kiện, bạn có thể chuyển tùy chọn im lặng, như sau:

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

Tôi hy vọng nó sẽ giúp bạn.

CẬP NHẬT:

Một cách khác:

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

thuộc tính sẽ được gọi là tùy chỉnh. Ví dụ: var customattribute = "test"; this.model.set ({customattribute: 12}); nếu bạn cố gắng nhận giá trị: this.model.get ("customattribute"); bạn sẽ nhận được 12, nếu bạn thử this.model.get ("test"); bạn sẽ nhận được không xác định và không 12 – Jareish

+0

sử dụng mảng được hỗ trợ, bạn có thể làm những gì bạn muốn. Tôi đã cập nhật để cung cấp cho bạn một ví dụ. Một lần nữa, nếu bạn không muốn kích hoạt một sự kiện, hãy chuyển tùy chọn: silent: true. – Aito

5

Bạn cần phải làm điều này

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

nếu thuộc tính là "test" và giá trị 'giá trị' nó sẽ là như nhau dưới dạng

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

đó là những gì chính xác thiết lập thuộc tính và truyền quan điểm của bạn nhờ vào mô hình sự kiện thay đổi

0

Tính đến Backbone 0.9.0 (Jan. 30, 2012), model.set (source) chấp nhận một chính, một giá trị , và một tùy chọn đối tượng.

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

tương đương với

var attr = {}; 
attr[attributeName] = value; 
this.model.set(attr, { silent: true }); 
Các vấn đề liên quan