我正在使用带有 REST 适配器的 Ember 数据。当您使用 this.transaction.commit() 保存记录并且服务器响应 422 验证错误时,可以使用“becameError”事件捕获这种情况。
但是,在更改表单字段中的数据并再次单击保存后(因此执行第二次 this.transaction.commit(),没有任何反应。事务未提交,因为我们处于无效状态......
我该如何解决这个问题?
我正在使用带有 REST 适配器的 Ember 数据。当您使用 this.transaction.commit() 保存记录并且服务器响应 422 验证错误时,可以使用“becameError”事件捕获这种情况。
但是,在更改表单字段中的数据并再次单击保存后(因此执行第二次 this.transaction.commit(),没有任何反应。事务未提交,因为我们处于无效状态......
我该如何解决这个问题?
您可以通过它的 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了解更多详情
转换到 ('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')
});
},
作为一个可怕的解决方法,您可以尝试保存记录的克隆。这将使您的原始记录保持原始状态。
如果保存成功,则删除原始记录。否则删除克隆并使用新克隆重试。