2011-09-13 31 views
11

Sử dụng Backbone.js Tôi biết bạn nên đặt thuộc tính của mô hình bằng phương pháp set và KHÔNG bằng cách sửa đổi trực tiếp attributes internal hash.backbone.js đặt thuộc tính nội bộ mô hình băm trực tiếp

Tuy nhiên, ngoài việc không tự động kích hoạt sự kiện "thay đổi", những điểm khác hoặc "tác dụng phụ" có trong việc sửa đổi băm nội bộ trực tiếp?

Vấn đề tôi đang gặp phải là trong khi phương thức thiết lập lấy một đối tượng theo nghĩa đen, tôi cần phải chỉ định phía bên tay trái sử dụng một biến được xác định tại thời gian chạy. Cảm ơn.

myModel.set({ 
    myProperty : myValue; //myProperty is a variable, so this is invalid syntax 
}) 

//vs 

myModel.attributes[myProperty] = myValue; //myProperty is a variable that can be evaluated 

Trả lời

15

Vâng, nếu bạn nhìn vào annotated source code, bạn sẽ thấy rằng set thực hiện rất nhiều.

gì nếu bạn mở rộng Backbone.Model với một chức năng nào đó cho bạn:

Backbone.Model.prototype.setByName = function(key, value, options) { 
    var setter = {}; 
    setter[key] = value; 
    this.set(setter, options); 
}; 

Sau đó, bạn chỉ có thể làm những gì bạn muốn trực tiếp trên mô hình:

var model = new Backbone.Model(); 
model.setByName(myProperty, "bar"); 

Mà cảm thấy như một giải pháp tốt hơn cho tôi.

Sửa

Như @ earl3s chỉ ra, điều này không còn cần thiết trong nhiều phiên bản gần đây của Backbone. Hôm nay, bạn chỉ có thể gọi model.set(myProperty, "bar") và nó thực hiện những gì bạn muốn.

+1

Tôi nghĩ giải pháp của bạn thật tuyệt vời. Hàm này sẽ được hợp nhất thành các bản phát hành Backbone mới hơn! Cảm ơn bạn cũng đã chỉ ra mã nguồn được chú thích; bạn nói đúng tôi nên nhìn nó ngay từ đầu. – fortuneRice

+0

đẹp! Tôi đã viết mã này một chục lần và không bao giờ nghĩ để làm cho nó một phương pháp. :) btw: không cần sử dụng _.extend cho việc này. 'Backbone.Model.prototype.setByName = function (...) {...}' thực hiện điều tương tự ... chức năng giống nhau. chỉ là một cách khác để làm điều đó. –

+0

@Derick Bailey: Buồn cười ... Tôi nghĩ rằng '_.extend' có thêm một số khéo léo để mở rộng nguyên mẫu ... không. Nó thực sự là để mở rộng bất kỳ đối tượng nào với một tập hợp các thay đổi. Không có gì điên rồ ở đó. Thay đổi câu trả lời của tôi để thừa nhận điều đó. Cảm ơn. –

7

Trong số annotated source code được đề cập bởi Brian Genisio bạn có thể đọc các dòng sau: "Xử lý cả hai" khóa ", giá trị và {key: giá trị} đối số kiểu.". Vì vậy, bạn chỉ có thể sử dụng model.set (myProperty, "bar", tùy chọn). Có lẽ họ đã thêm tính năng này sau bài viết của Brian Genisio .. i dunno.

+0

Đây là giải pháp đúng. Chức năng đã tồn tại trên phương thức 'set'. – earl3s

Các vấn đề liên quan