Backbone.js: коллекция, содержащая несколько моделей с одинаковым идентификатором
У меня есть объединенная коллекция в Backbone, которая содержит фотографии и альбомы.
Чтобы отличить их, я добавил поле 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)
Теперь я обнаружил странную ошибку, когда добавление фотографии и альбома с тем же идентификатором (пусть 2
) приводит к слиянию.
Я проследил это до этих LOC в исходном коде. Кажется, что он отменяется без создания вилки самой Базы. Я пробовал, но он также не прошел 35 тестов.
Я думал о 4 разных способах этого, я не знаю, какой из них лучше:
- Я могу добавить префикс к id. Скажем,
photo_2
. Это приводит к изменению бэкэнд, а также к некоторым изменениям в интерфейсе, чтобы не попасть на сервер с /photos/photo_2
- Я мог бы использовать Backbone и изменить эти LOC.
- Я мог бы создать две отдельные коллекции, но должен иметь дело с слиянием и сортировкой в представлении (что влияет на производительность клиентов и требует перезаписи бэкэнд).
- Я мог бы начать с идентификатора фотографии, скажем
1000000
. Это чрезвычайно снизило бы вероятность того, что данный пользователь, загрузивший фотографию с данным ID, также создал альбом с тем же идентификатором.
Ответы
Ответ 1
Начиная с версии 1.2 вы можете использовать Collection.modelId
, чтобы указать, как ваша коллекция будет уникально идентифицировать модели. В вашем случае вы можете сделать следующее, чтобы убедиться, что ваши типы имеют разные идентификаторы.
var MyCollection = Backbone.Collection.extend({
modelId: function (attrs) {
return attrs.type + "-" + attrs.id;
}
// ...
})
Ответ 2
Я бы предположил, что на альбоме и в фотографии вы добавляете следующее:
idAttribute: 'uniqueId'
parse: function(response) {
response.uniqueId = type+'_'+response.id
return response;
}
Ответ 3
idAttribute:'uniqueId'
если этот уникальный идентификатор не известен при объявлении, попробуйте
idAttribute:'UUID'
Я сгенерировал один из https://www.uuidgenerator.net/ и поместил его здесь, этот атрибут, определенный здесь, не обязательно должен быть в модели, поэтому я просто вставил UUID.