2013-06-03 39 views
10

Tôi đã hợp nhất bộ sưu tập trong Backbone có chứa ảnh và album.Backbone.js: Bộ sưu tập chứa nhiều Mô hình cùng một ID

Để phân biệt chúng, tôi đã thêm một trường typephoto hoặc album. Khi tôi cư trú trong bộ sưu tập, tôi có thể tạo mô hình khác nhau trong phương pháp Collection#model

model: (attrs, options) -> 
    switch attrs.type 
     when 'album' then new App.Models.Album(attrs, options) 
     when 'photo' then new App.Models.Photo(attrs, options) 

Bây giờ tôi đã discoverd một lỗi lạ nơi thêm một bức ảnh và một album với cùng một ID (giả sử 2) kết quả trong một hợp nhất.

Tôi đã theo dõi điều này xuống đến these LOC trong mã nguồn. Dường như nó có thể hoàn tác mà không tạo ra một ngã ba của chính Backbone. Tôi đã thử nó nhưng nó cũng fails 35 tests.

Tôi nghĩ đến 4 cách khác nhau để làm điều này, tôi không biết được trong số họ là một trong những tốt hơn:

  1. tôi có thể thêm một tiền tố để định danh. Giả sử photo_2. Điều này gây ra thay đổi trong chương trình phụ trợ cũng như một số thay đổi trong giao diện người dùng để không truy cập máy chủ tại số /photos/photo_2
  2. Tôi có thể ngã ba Backbone và change these LOC.
  3. Tôi có thể tạo hai bộ sưu tập riêng biệt nhưng phải xử lý hợp nhất và sắp xếp trong chế độ xem (ảnh hưởng đến hiệu suất của khách hàng và yêu cầu viết lại phụ trợ)
  4. Tôi có thể bắt đầu bằng ID ảnh, giả sử 1000000 . Điều này sẽ làm giảm đáng kể xác suất mà người dùng đã tải lên ảnh có ID đã cho cũng đã tạo một album có cùng ID.

Trả lời

7

Kể từ phiên bản 1.2, bạn có thể sử dụng Collection.modelId để chỉ định cách sưu tập của bạn độc đáo sẽ xác định mô hình. Trong trường hợp của bạn, bạn có thể làm như sau để đảm bảo rằng các loại của bạn có các ID khác nhau.

var MyCollection = Backbone.Collection.extend({ 
    modelId: function (attrs) { 
     return attrs.type + "-" + attrs.id; 
    } 
    // ... 
    }) 
+0

Có cách nào lấy mô hình làm đối số ở đây thay vì chỉ là thuộc tính của nó không? –

7

tôi sẽ đề nghị rằng trên cả Album và ảnh, bạn thêm dòng sau:

idAttribute: 'uniqueId' 
    parse: function(response) { 
    response.uniqueId = type+'_'+response.id 
    return response; 
    } 
Các vấn đề liên quan