Ember:transactionInmit事件发生后不会触发transaction.commit

时间:2013-08-08 21:57:49

标签: ember.js ember-data

我正在使用REST适配器的Ember数据。使用this.transaction.commit()保存记录并且服务器响应422验证错误时,可以使用“becomeError”事件捕获此案例。

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

我该如何解决这个问题?

3 个答案:

答案 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)

作为一种可怕的解决方法,您可以尝试保存记录的克隆。这将保留原始记录。

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