2011-12-15 33 views
19

Một số mô hình Backbone của tôi phải luôn sử dụng POST, thay vì POST để tạo và PUT để cập nhật. Các máy chủ tôi vẫn tồn tại các mô hình này để có khả năng hỗ trợ tất cả các động từ khác, do đó, sử dụng Backbone.emulateHTTP cũng không phải là một giải pháp hoàn hảo.Cách xấu xí nhất để buộc các bản cập nhật Backbone.sync sử dụng POST thay vì PUT là gì?

Hiện tại tôi ghi đè phương thức isNew cho các mô hình này và yêu cầu trả lại true, nhưng điều này không lý tưởng.

Khác với việc sửa đổi mã backbone.js trực tiếp, có cách đơn giản để đạt được mục tiêu này trên cơ sở từng mô hình không? Một số mô hình của tôi có thể sử dụng PUT (chúng được duy trì cho một máy chủ khác hỗ trợ tất cả các động từ, bao gồm PUT), do đó, việc thay thế Backbone.sync bằng một trình chuyển đổi phương thức 'cập nhật' thành 'tạo' cũng không lý tưởng.

+2

Bạn có thể khai báo phương thức 'sync' cho các mô hình cần POST thay vì PUT và triển khai cục bộ trên mô hình theo cách đó. Bạn không cần phải ghi đè lên tất cả các mô hình. Hãy xem câu trả lời này trên SO: http://stackoverflow.com/a/5096624/844726 – swatkins

+1

Đây không phải là những gì ['Backbone.emulateHTTP'] (http://documentcloud.github.com/backbone/#Sync -emulateHTTP) dành cho? –

Trả lời

8

thêm đồng bộ hóa (phương thức, mô hình, [tùy chọn]) trực tiếp vào các mô hình bạn cần ghi đè.

YourModel = Backbone.Model.extend({ 
    sync: function(method, model, options) { 
    //perform the ajax call stuff 
    } 
} 

Dưới đây là một số thông tin hơn: http://documentcloud.github.com/backbone/#Sync

+0

Điều này sẽ làm việc, nhưng câu trả lời của Andrés là sạch hơn nhiều! – jackocnr

15

ngắn và ngọt được đặt này on Top

Backbone.emulateHTTP = true; 

này sẽ sử dụng Nhận cho Kéo và Bưu cho tất cả push (đọc Tạo, Update, Delete)

5

cách tôi đã thực hiện nó là ghi đè sync() do đó

Models.Thing = Backbone.Model.extend({ 
    initialize: function() { 
     this.url = "/api/thing/" + this.id; 
    }, 
    sync: function(method, model, options) { 
     if (method === "read") method = "create"; // turns GET into POST 
     return Backbone.sync(method, model, options); 
    }, 
    defaults: { 
     ... 
53

Đối với bất kỳ ai cần để buộc một yêu cầu POST/PUT trên dụ trực tiếp:

thing = new ModelThing({ id: 1 }); 
thing.save({}, { // options 
    type: 'post' // or put, whatever you need 
}) 
+2

Tôi đã sử dụng câu trả lời này thay vì câu trả lời được chấp nhận và nó hoạt động hoàn hảo. – hamishtaplin

+1

Trong khi câu trả lời được chấp nhận hoạt động và linh hoạt, tôi nghĩ đây là câu trả lời phù hợp hơn cho câu hỏi. –

+0

Đã lưu ngày của tôi. Cảm ơn. – user151851

4

tôi đã sử dụng một biến thể của Andres' câu trả lời và thay vì havivng nhớ để vượt qua các tùy chọn { type: 'post' } ở khắp mọi nơi mà tôi gọi .save() Tôi thay thế chỉ cần thay thế các chức năng save trên mô hình để có nó luôn luôn thêm tùy chọn đó sau đó gọi thực hiện cơ sở. Nó cảm thấy sạch hơn ...

module.exports = Backbone.Model.extend({ 
    idAttribute: 'identifier', 
    urlRoot: config.publicEndpoint, 

    save: function (attributes, options) { 
    // because the 'identifier' field is filled in by the user, Backbone thinks this model is never new. This causes it to always 'put' instead of 'post' on save. 
    // overriding save here to always pass the option use post as the HTTP action. 
    options = _.extend(options || {}, { type: 'post' }); 
    return Backbone.Model.prototype.save.call(this, attributes, options); 
    } 
}); 
Các vấn đề liên quan