Какой стандартный шаблон для проверки данных ember? (недействительное состояние стало недействительным…)

Я с этим некоторое время боролся с этим; Посмотрим, сможет ли кто-нибудь мне помочь.

Хотя это явно не указано в файле Readme, ember-data обеспечивает некоторую поддержку валидации. Вы можете видеть это в некоторых частях кода и документации:

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L411

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L529

Адаптер REST не добавляет поддержки валидации сам по себе, но я обнаружил, что если я добавлю что-то подобное в вызовах ajax, я могу поставить модель на «неверный». состояние с объектом ошибок, которые пришли со стороны сервера:

error: function(xhr){
  var data = Ember.$.parseJSON(xhr.responseText);
  store.recordWasInvalid(record, data.errors);
}

Так что я могу легко следующее:

var transaction = App.store.transaction();
var record = transaction.createRecord(App.Post);
record.set('someProperty', 'invalid value');
transaction.commit()
// This makes the validation fail

record.set('someProperty', 'a valid value');
transaction.commit();
// This doesn't trigger the commit again.

Дело в том, что, как вы видите,transactions don't try to recommit, Это объясняетсяВот а такжеВот.

Итак, дело в том, что если я не могу повторно использовать коммит, как мне справиться с этим? Я подозреваю, что это как-то связано с тем, что я асинхронно помещаю модель вinvalid состояние - почтение документацииПохоже, что-то предназначено для проверки на стороне клиента. В таком случае, как мне их использовать?

Ответы на вопрос(5)

По какой-то неизвестной причине запись становится частью транзакции хранилища по умолчанию. Этот код работает для меня:

var transaction = App.store.transaction();
var record = transaction.createRecord(App.Post);
record.set('someProperty', 'invalid value');
transaction.commit()

record.set('someProperty', 'a valid value');
App.store.commit(); // The record is created in backend

Проблема в том, что после первого сбоя вы всегда должны использоватьApp.store.commit() с проблемами, которые у него есть.

 14 нояб. 2012 г., 04:01
Я могу ошибаться, но я думаю, что она ассоциируется как транзакция по умолчанию, если вы не определите контекст.
 26 нояб. 2012 г., 13:31
У вас есть примеры этого?

Я попытался ответить Хавьеру, но получил "Неверный путь". при выполнении любогоrecord.set(...) с записью в недействительном состоянии. То, что я нашел, работало:

// with the record in invalid state
record.send('becameValid');
record.set('someProperty', 'a valid value');
App.store.commit();

В качестве альтернативы, кажется, что если я позвонюrecord.get(...) сначала потомrecord.set(...) звонки работают. Это, вероятно, ошибка. Но описанный выше обходной путь в целом будет работать для возможности повторной фиксации той же записи даже без изменения каких-либо свойств. (Конечно, если свойства все еще недействительны, они просто снова потерпят неудачу.)

 11 апр. 2013 г., 11:59
Я добавилrecord.send('becameValid'); в моей моделиbecomeInvalid функция. Это обошло мою проблему. Это вдохновлено комментарием к запросу GitHub от Сирила.

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

также, вероятно, вам следует подумать о том, чтобы написать это на уровне магазина, а не на уровне адаптера, для повторного использования.

 01 окт. 2012 г., 17:21
не будет ли это проблематичным, поскольку вы не можете добавлять грязные объекты в транзакции?

Посмотрите на эту суть. Это шаблон, который я использую в своих проектах.

https://gist.github.com/danielgatis/5550982

У меня есть ожидающий запрос, который должен исправить это

https://github.com/emberjs/data/pull/539

Ваш ответ на вопрос