Cách đúng để thực hiện yêu cầu PATCH
trong khi lưu thuộc tính của mô hình trong Backbone.js là gì?Phương pháp yêu cầu PATCH trong Backbone.js
Trả lời
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
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 OPTIONS
và HEAD
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.
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.
Wow, Ngăn xếp ngăn xếp không cho phép đăng câu hỏi với các từ toàn bộ mũ trong tiêu đề. Thông minh. – Burnash