2012-11-14 28 views
19

tôi gọi tiết kiệm sử dụng này:model.save Backbone() được gửi PUT thay vì POST

console.log(this.model.isNew()); 
console.log(this.model); 

this.model.save({}, { 
    success: function (model, response, options) { 
     console.log(response); 
    }, 
    error: function (model, xhr, options) { 
     console.log(xhr.result.Errors); 
    } 
}); 

Các isNew() lợi nhuận sai. Nhưng đầu ra của this.model có một ID của 0. (this.model.id là 0 cũng)

url của tôi là url: ROOTAREA + "/Expenses/Entry/",

Đang cập nhật hoạt động tốt, và sử dụng PUT như mong đợi.

Edit: đây là một phần của mô hình của tôi:

defaults: function() { 
     return { 
      DocumentDate: "", 
      JobNo_: "", 
      PhaseCode: "", 
      WorkTypeCode: "", 
      Description: "", 
      Quantity: 0, 
      UnitCost: 0, 
      ExpenseCurrencyCode: "", 
      ReimbursementCurrencyCode: "", 
      UnitofMeasureCode: "DIEM", 
      LineNo_: 0 
     }; 
    }, 
    idAttribute: "LineNo_", 

Trả lời

27

ID thậm chí không nên tồn tại cho một mục mới. Vấn đề nằm trong phần bạn không hiển thị - trong phần mà bạn khởi tạo, tạo và điền vào mô hình.

Dưới đây là một trích dẫn từ the Backbone documentation:

Nếu mô hình vẫn chưa có một id, nó được coi là mới.

Rõ ràng từ mã của bạn mà bạn đang gán thuộc tính id. Chương trình phụ trợ của bạn nên thực hiện điều đó. Và kể từ khi bạn đang làm nó trên một khách hàng, xương sống giả định nó nó không phải là mới, và sử dụng PUT

+0

Tôi đã thực hiện một chỉnh sửa bài của tôi cho thấy mô hình. Tôi có nên thay đổi LineNo_ thành một cái gì đó khác 0? – Rail24

+0

@ Rail24 Loại bỏ hoàn toàn, nếu có thể. Backbone kiểm tra id với null để xác định xem nó có mới không. Xem http://documentcloud.github.com/backbone/docs/backbone.html#section-63 – nikoshr

+0

Tôi đã thay đổi LineNo_ thành mặc định là null và giải quyết được sự cố của tôi! Cảm ơn bạn toninoj! – Rail24

2

Bạn có thể chỉ định id trong giá trị mặc định, chỉ cần đảm bảo nó được thiết lập để null (isNew sẽ được thiết lập là true)

19

Các câu trả lời ở trên là chính xác ở chỗ nếu model bạn là .save 'ing có một xương sống thuộc tính id sẽ làm một PUT thay vì POST.

Hành vi này có thể được ghi đè đơn giản bằng cách thêm type: 'POST' để tiết kiệm khối của bạn:

var fooModel = new Backbone.Model({ id: 1}); 

fooModel.save(null, { 
    type: 'POST' 
}); 
+2

Cảm ơn bài đăng của bạn, nó đã giúp tôi trong một trường hợp tương tự. Tôi phát hiện ra (đọc nguồn Backbone) mà bạn không cần phải tạo mô hình, lưu nó và sau đó thêm vào bộ sưu tập, bạn chỉ cần chuyển loại: 'POST' vào phương thức create() của bộ sưu tập: fooCollection.create ({id: 1}, {type: 'POST'}); – Shu

+0

Đối với các giải pháp khác, hãy xem: [Cách nào là xấu nhất để buộc các bản cập nhật Backbone.sync sử dụng POST thay vì PUT?] (Http://stackoverflow.com/q/8527694/1218980) –

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