2012-05-17 37 views

Trả lời

32

Kể từ Backbone.js v0.9.9, bạn có thể chỉ cần chuyển { patch: true } đến save().

Read more: http://backbonejs.org/#changelog

+0

Cảm ơn bạn đã cập nhật! – Burnash

+0

'myModel.save (dữ liệu, {patch: true})' hiển thị cho tôi trong bảng điều khiển mạng của Chrome như sử dụng phương thức HTTP là "TÙY CHỌN", có vẻ không đúng. – SimplGy

+1

OPTIONS được gửi trước tiên là PRE-FLIGHT. Nếu được thông qua, thì PATCH sẽ được gửi. –

8

Bạn sẽ phải ghi đè Backbone.sync và mở rộng các phương pháp ánh xạ hiện

var methodMap = { 
    'create': 'POST', 
    'update': 'PUT', 
    'delete': 'DELETE', 
    'read': 'GET', 
    'patch': 'PATCH' 
}; 

bạn sẽ phải tạo ra phương pháp vá của riêng bạn trên một mô hình như

Backbone.Model.prototype.patch = function(options) 
{ 
    // some code here that checks what attributes have changed since last save 
    var xhr = (this.sync || Backbone.sync).call(this, 'patch', this, options); 
    return xhr; 
} 

Tôi chắc chắn bạn có thể mở rộng Backbone thêm để bao gồm OPTIONSHEAD nếu bạn cần phải

Lưu ý rằng, ngay cả thông qua jQuery cũng hỗ trợ các phương pháp PATCH, OPTIONS và HEAD, trình duyệt của người dùng cuối có thể không.

8

Ngoài James Cropchos answer Tôi muốn thêm những điều sau đây, vì this steals some hours từ tôi và có lẽ sẽ giúp người khác:

Nếu bạn sử dụng model.save(attributesToPatchObject,{patch: true}) như nó có thể từ xương sống v.0.9. 9 như đã nêu trong câu trả lời của James Cropchos, bạn có thể tự hỏi làm cách nào để xác định thuộc tính nào đã thay đổi kể từ cuộc gọi cuối cùng của model.save() để chuyển chúng thành attributesToPatchObject, đó là đối số đầu tiên từ model.save() (hoặc model.fetch() nếu bạn không lưu mô hình gần đây) .

Chính xương sống không theo dõi các thuộc tính đó. Tôi nghĩ rằng các phương pháp model.changedAttributes() có thể phù hợp, nhưng như backbone-doc says phương pháp này trả về

một hash của các thuộc tính duy nhất của mô hình đã thay đổi kể từ set cuối cùng, hoặc giả nếu có none

Vì vậy, phương pháp này không phù hợp với nhu cầu này. Sau một số nghiên cứu, tôi phát hiện ra rằng chính xương sống không theo dõi các thuộc tính chưa được lưu (Tôi biết, không phải là một phát hiện tuyệt vời nếu tôi đã đọc tài liệu cẩn thận hơn).

Tôi phát hiện ra rằng backbone.trackit là một plugin xương sống chính xác thêm tính năng cần thiết vào xương sống, bằng cách thêm phương thức unsavedAttributes() vào mô hình. Các tài liệu của backbone.trackit nói về phương pháp này:

Đối xứng với mô hình của mô hình đã thay đổi kể từ lần lưu cuối cùng hoặc sai nếu không có . Giống như changedAttributes, một băm thuộc tính bên ngoài có thể được chuyển vào, trả về các thuộc tính trong hàm băm đó khác với mô hình.

Nó hoạt động như thế này:

//fetch an existing model from server 
model.fetch({ 
    success : function(model, respose, options) { 
    //tell backbone.trackit to track unsaved Attributes 
    model.startTracking(); 
    } 
}); 

//now some changes to the model happen 
model.set("someProperty", "someValue"); 

/* save the model to server using the PATCH-Method 
    and only send the unsaved Attributes; 
    in this case only "someProperty" is sent 
*/ 
model.save(model.unsavedAttributes(), {patch: true}); 

Kể từ khi unsavedAttributes() lợi nhuận sai nếu không có thuộc tính chưa được lưu, bạn có thể bổ sung quấn tuyên bố save() của bạn trong vòng một điều kiện if-mà kiểm tra nếu unsavedAttributes() lợi nhuận một cái gì đó khác rồi false và chỉ thực hiện yêu cầu PATCH nếu cần thiết (vì có gì đó đã thay đổi).

LƯU Ý: Bạn không phải gọi số fetch() để sử dụng startTracking() để bạn có thể sử dụng phương pháp này ngay cả với các mô hình mới được tạo (model.isNew() trả về đúng trên mô hình đó), nếu có.

Hy vọng điều này có thể tiết kiệm cho người nào đó một chút thời gian nghiên cứu.

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