Я использую довольно новую версию Ember (Ember 3.7.2, Ember Data: 3.7.0)
Я создаю запись в клиенте (используя store.createRecord()
) и даю ей GUID в качестве идентификатора.
Запись должна иметь идентификатор в клиенте, потому что она не сразу сохраняется в серверной части. Пользователь может редактировать запись до ее сохранения.
Затем я сохраняю его на сервер с record.save()
и использую JSONAPIAdapter
.
Серверная часть изменяет идентификатор на целое число (автоинкремент в базе данных), а полезная нагрузка, возвращаемая с сервера, включает вновь сохраненный объект с этим новым идентификатором.
Идея состоит в том, что среда данных ember должна обновить запись с новым идентификатором из бэкэнда. Этого не происходит в ember-data 3.7. Это произошло в ember-data 3.0.1 до того, как я обновился до последней версии ember.
Объект в клиенте сохраняет свой GUID и, кроме того, теперь он имеет состояние "isSaving"=true
.
Итак, если я позже попытаюсь удалить этот объект, я получу эту ошибку:
Попытка обработки события deleteRecord
во время нахождения в состоянии root.loaded.created.inFlight.
Я использую стандартную версию JSONAPISerializer
.
Чтобы иметь возможность присвоить записи идентификатор на стороне клиента, я вложил в класс JSONAPIAdapter этот метод:
generateIdForRecord: function(/* store, record */) {
var d = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random()*16)%16 | 0;
d = Math.floor(d/16);
return (c==='x' ? r : (r&0x3|0x8)).toString(16);
});
return uuid;
}
Что я должен сделать, чтобы сохранить правильно и не получить ошибку при попытке удалить объект?
Примечание
Я откатился на ember версии 3.0.0 / ember data версии 3.0.1. В той версии все работало нормально. То есть идентификатор был обновлен в записи, когда с сервера был возвращен вызов сохранения с новым идентификатором.
Таким образом, должно быть изменение с ember 3.0.0 до 3.7.0, относящееся к record.save
, и обновление идентификатора и состояния isSaving / сохранено.