2013-06-03 3 views
10

У меня есть объединенная коллекция в Backbone, которая содержит фотографии и альбомы.Backbone.js: Коллекция, содержащая несколько моделей с одинаковыми ID

Чтобы различить их, я добавил поле type, которое либо photo, либо album. Когда я заполнить коллекцию, я создаю различные модели в рамках метода 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) 

Теперь я discoverd странный баг, когда при добавлении фото и альбом с тем же ID (скажем 2) результаты в слиянии.

Я отслеживал это до these LOC в исходном коде. Кажется, что он отменен без создания вилки самого Backbone. Я пробовал, но это также fails 35 tests.

Я подумал о 4-х различных способов сделать это, я не знаю, какой из них лучше один:

  1. Я мог бы добавить префикс к идентификатору. Скажем, photo_2. Это приводит к изменениям в бэкэнде, а также к некоторым изменениям в интерфейсе, чтобы не попасть на сервер по адресу /photos/photo_2
  2. Я мог бы переделать магистраль и change these LOC.
  3. я мог бы создать два отдельные коллекции, но приходится иметь дело с слиянием и своего родом в представлении (какие эффекты производительности клиентов и требует переписывания бэкэнда)
  4. Я мог бы начать с фотографией идентификатором, скажем 1000000 , Это чрезвычайно снизило бы вероятность того, что данный пользователь, который загрузил фотографию с данным ID, также создал альбом с тем же идентификатором.

ответ

7

Начиная с версии 1.2 вы можете использовать Collection.modelId, чтобы определить, как ваша коллекция будет однозначно идентифицировать модели. В вашем случае вы можете сделать следующее, чтобы убедиться, что ваши типы имеют разные идентификаторы.

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

Есть ли способ получить модель в качестве аргумента здесь, а не только ее атрибуты? –

7

Я хотел бы предложить, что на обоих альбома и фото, можно добавить следующее:

idAttribute: 'uniqueId' 
    parse: function(response) { 
    response.uniqueId = type+'_'+response.id 
    return response; 
    } 
Смежные вопросы