1

我正在使用带有 REST 适配器的 Ember 数据。当您使用 this.transaction.commit() 保存记录并且服务器响应 422 验证错误时,可以使用“becameError”事件捕获这种情况。

但是,在更改表单字段中的数据并再次单击保存后(因此执行第二次 this.transaction.commit(),没有任何反应。事务未提交,因为我们处于无效状态......

我该如何解决这个问题?

4

3 回答 3

1

您可以通过它的 stateManager 将模型转换回未提交状态。如果它是现有记录,则转换到loaded.updated.committed

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

对于新记录,过渡到loaded.created.uncommitted

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

认为这是一种解决方法,直到 ember-data API 有更好的方法。

请参阅处于错误状态时您可以使用 Ember 数据模型做什么?https://gist.github.com/intrica/4773420了解更多详情

于 2013-08-08T22:51:50.587 回答
0

转换到 ('loaded.created.uncommitted') 状态后,如果发生 becomeInvalid 状态,您需要使用store defaultTransaction重新提交。

请参阅下面的代码 - 非常脏的检查以了解是使用 transaction.commit() 还是 defaultTransaction.commit()

save: function () {

//Local commit - author record goes in Flight state
this.transaction.commit();

//After a becameInvalid state, transaction.commit() does not work; use defaultTransaction in that case
//Is this the only way to do this ?
if (this.get('stateManager.currentState.name') == "uncommitted") {
  this.get('store').get("defaultTransaction").commit();
}

var author = this.get('model');

author.one('didCreate', this, function () {
  this.transitionToRoute('author.edit', author);
});

//If response is error (e.g. REST API not accessible): becameError fires
author.one('becameError', this, function () {
  this.get('stateManager').transitionTo('loaded.created.uncommitted');
});

//If response is 422 (validation problem at server side): becameInvalid fires
author.one('becameInvalid', this, function () {
  this.set('errors', this.get('content.errors'));

  //Does set stateManager.currentState.name to uncommitted, but when committing again, nothing happens.  
  this.get('stateManager').transitionTo('loaded.created.uncommitted')
});

},

于 2013-08-09T09:35:05.080 回答
0

作为一个可怕的解决方法,您可以尝试保存记录的克隆。这将使您的原始记录保持原始状态。

如果保存成功,则删除原始记录。否则删除克隆并使用新克隆重试。

于 2015-06-18T06:05:13.513 回答