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

Каков стандартный шаблон для валидации данных ember-данных? (недопустимое состояние, wasInvalid...)

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

Хотя это явно не указано в 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.

Дело в том, что, как вы видите, транзакции не пытаются подтвердить. Это объясняется здесь и здесь.

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

4b9b3361

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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() с проблемами, которые у него есть.