2012-04-11 25 views
10

Tôi có một đối tượng cũng được lưu trong máy chủ và tôi đang tạo mô hình Backbone từ đối tượng đó.Làm thế nào để tôi nói cho biết rằng mô hình không phải là mới

Nhưng khi tôi lưu mô hình, nó đang thực hiện một yêu cầu PUT, đó không phải là những gì tôi muốn. Làm thế nào để nói với Backbone rằng dữ liệu đã có trong máy chủ mà không thực hiện tìm nạp?

+0

Bản đồ xương trụ yêu cầu cập nhật cho PUT http://documentcloud.github.com/backbone/#Sync để bạn mong đợi hành vi nào? – nikoshr

+0

Tôi nghĩ rằng các yêu cầu cập nhật đã được ánh xạ tới POST, nhưng PUt đã được sử dụng để tạo một mục mới. – archmage

+0

Nếu ai đó muốn ép buộc yêu cầu POST, có [nhiều lựa chọn thay thế] (http://stackoverflow.com/a/41091957/1218980). –

Trả lời

18

Backbone xác định sự mới mẻ của một mô hình bằng checking if an id is set:

isNewmodel.isNew()

đã mô hình này được lưu vào máy chủ chưa? Nếu mô hình chưa có id, thì nó được coi là mới.

Và khi bạn lưu một mô hình,

  • nếu nó là mới, một yêu cầu POST sẽ được phát ra,
  • nếu nó là một bản cập nhật (một id đã được thiết lập), một yêu cầu PUT sẽ được gửi

Backbone Sync documentation


Và như được ghi chú bởi @JayC trong các nhận xét:

Nếu có vấn đề là id không thể là id, bạn có thể sử dụng idAttribute để nói đó là "danh tính" hoặc trường khóa.

+4

Lưu ý, nếu có vấn đề là id không thể là 'id', bạn có thể sử dụng idAttribute. http://documentcloud.github.com/backbone/#Model-idAttribute để nói đó là trường "nhận dạng" hoặc khóa. – JayC

+0

Câu hỏi: Tôi có một mô hình mới (không có id), nhưng nó có các trường khác được đặt ở giao diện người dùng. khi tôi lưu mô hình, nó gửi yêu cầu PUT. Không nên gửi yêu cầu POST vì không có ID? – archmage

+2

@archmage Lạ, nó phải là POST. Kiểm tra này Fiddle http://jsfiddle.net/jq98Z/, nó tái tạo các hành vi mong đợi. Có lẽ bạn đã overrode đồng bộ mặc định hoặc bản đồ hành động ở đâu đó? – nikoshr

-1

Thêm hai xu của tôi ở đây, hy vọng nó tránh một số kéo tóc tôi phải làm.

Thiết sở hữu id của một mô hình trực tiếp thông qua constructor false hoặc null sẽ không làm các trick, bạn phải thực sự loại bỏ nó khỏi bộ nhớ qua qua xóa

Ví dụ, tôi chỉ đấu tranh để sao chép các thuộc tính từ một mô hình nhập một loại khác làm kiểu mới:

copy = Trip.clone() 
#doesn't unset the id attribute 
schedule = new models.Schedule(_.extend(copy.attributes, {id:null, trip_id:id}) 
#does unset the id attribute 
delete schedule.id 
schedule.save null, success: => 
    # back from POST vs PUT 
    ... 
Các vấn đề liên quan