Подтвердить что ты не робот

Что вы можете сделать с Ember Data Models, когда в состоянии ошибки?

Я пытаюсь понять рабочий процесс, который будет использоваться в следующем сценарии:

Пользователь создает модель, позвонив ей в продукт. Мы представляем их с заполненной формой. Ошибки сохранения по какой-либо причине, кроме валидации (тайм-аут, доступ запрещен и т.д.). В Ember это приводит к тому, что модель переходит в состояние ошибки. С точки зрения пользовательского интерфейса все, что я хочу сделать, это поместить сообщение на экран (легко) и позволить пользователю попробовать еще раз (видимо, не так просто).

Я видел, как он много раз писал, чтобы не использовать транзакцию повторно. Я понимаю логику этого. В случае с новым продуктом я просто создаю еще один новый продукт, объединяя данные из исходного продукта (атрибуты, отношения) и заменяю содержимое моего контроллера новым продуктом. Это было непросто и, похоже, работает хорошо, хотя может (надеюсь) лучший способ.

Однако, когда я редактирую Продукт, у меня возникла серьезная проблема, и вышеупомянутое решение не работает. Модель продукта теперь находится в состоянии ошибки, и я не могу найти способ получить копию этого Продукта, которая также не находится в том же состоянии.

Что я не могу понять, это то, что я могу сделать с этой моделью, когда она попадает в состояние ошибки. Я пробовал следующее:

Откат: Это не работает. Вы не можете отменить транзакцию в состоянии ошибки.

Обновить: То же, что и выше. Не разрешено перезагружать запись в состоянии ошибки.

Возьмите новую копию записи:. Поэтому я пытаюсь использовать App.Product.find(id) с тем же идентификатором, что и существующая запись. Он просто дает мне копию существующей записи в состоянии ошибки.

Я надеюсь, что мне не хватает чего-то достаточно простого здесь. Можно ли отличить запись из состояния ошибки (или недействительного состояния)?

Если есть простой способ изменить состояние этих моделей, должна ли мы по-прежнему создавать новую транзакцию для дальнейших попыток совершить?

4b9b3361

Ответ 1

Итак, после нескольких дней чтения источника и экспериментов, я пришел к выводу, что это функциональность, которая еще не реализована. Чтобы переместить запись в другое состояние, вы должны отправить ему событие, которое передает его на statemanager. По-видимому, в состоянии ошибки не зарегистрировано событий, что позволяет нам восстановить запись.

Существует уродливое обходное решение - я могу называть transitionTo на statemanager записи и заставлять его в желаемое состояние. Я не решил сделать это легко, но на этом этапе я должен продолжить работу над проектом, пока я жду, пока данные ember-данных будут развиваться. Поэтому, если запись пока не сохранена, мы можем спасти ее от недопустимого или ошибочного состояния, вызвав:

model.get('stateManager').transitionTo('loaded.created.uncommitted')

или для существующей записи:

model.get('stateManager').transitionTo('loaded.updated')

Как только это вызвано, вы можете попытаться снова вызвать фиксацию транзакции, в которой находится модель. Это будет транзакция по умолчанию, поскольку поведение данных ember-данных заключается в перемещении модели в транзакцию по умолчанию, как только commit был вызван на него оригинальной транзакцией. Вы всегда можете получить текущую транзакцию для модели, вызвав model.get('transaction')

Итак, в конце этого, у меня есть способ создать типичный сценарий CRUD, который мы можем увидеть в Ruby on Rails, но я не верю, что это идеальный способ сделать это. Однако я верю в то, что на данный момент также не работает команда ember-data.

Для тех из вас, кто интересуется наличием CRUD-функций в качестве контроллера и маршрутных миксинов для Ember, у меня есть Gist, который содержит используемый мной код я cam. Это отлично работает, восстанавливается из ошибок сохранения, а также ошибок проверки. Надеюсь, я смогу продолжить уточнение этого, поскольку эволюция данных ember.

Ответ 3

Вы можете вызвать событие becameValid на нем:

record.send("becameValid");

Это должно перевести модель в незафиксированное состояние.

Ответ 4

Дэвид,

Можно попытаться создать параллельное представление модели как объекта Ember.Object, который не сохраняется, но обладает теми же свойствами, что и ваша сохраненная модель. Если ваш ajax возвращается в состояние ошибки, вы можете использовать обратный вызов ошибки, предоставляемый методом ajax, чтобы что-то сделать.

В этом случае "что-то" может быть для удаления записи, а затем клонировать свойства из вашего фиктивного объекта в новую запись и повторно сохранять запись. При успешном обратном вызове просто уничтожьте ваш временный объект, и если все записи чисты, очистите свои временные объекты (чтобы предотвратить затяжные временные объекты).

Это тоже может быть безумным... но это мне кажется как вариант.

Стив