我正在使用REST适配器的Ember数据。使用this.transaction.commit()保存记录并且服务器响应422验证错误时,可以使用“becomeError”事件捕获此案例。
但是,在更改表单字段中的数据并再次单击“保存”(因此执行第二次this.transaction.commit()后,没有任何操作。由于我们处于无效状态,因此未提交事务...
我该如何解决这个问题?
答案 0 :(得分: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有更好的方法之前,请将此视为一种解决方法。
有关详细信息,请参阅What can you do with Ember Data Models when in the error state?和https://gist.github.com/intrica/4773420
答案 1 :(得分:0)
如果处于becomeInvalid状态,转换为('loaded.created.uncommitted')状态后,您需要使用存储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')
});
},
答案 2 :(得分:0)
作为一种可怕的解决方法,您可以尝试保存记录的克隆。这将保留原始记录。
如果保存成功,请删除原始记录。 否则,删除克隆并再次使用新克隆。