Ember.js record.save () выполнен успешно, но объект находится в состоянии - PullRequest
1 голос
/ 04 апреля 2019

Я использую довольно новую версию 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 / сохранено.

...