在状态root.loaded.updated.inFlight中尝试处理事件`willCommit`

时间:2013-08-20 16:26:01

标签: javascript ember.js

我正在通过“入门”页面的入门教程学习如何使用EmberJS。但是,当我进入“接受编辑”部分时,我有一个错误:

Uncaught Error: Attempted to handle event `willCommit` on <Todos.Todo:ember304:3> while in state root.loaded.updated.inFlight. 

Todos.TodoController.acceptChanges()的调用似乎触发了这个错误。我所指的部分就是这个: http://emberjs.com/guides/getting-started/accepting-edits/

在读完Ember中的模型生命周期 - http://emberjs.com/guides/models/model-lifecycle/#toc_in-flight后 - 我仍然不明白为什么会出现这个错误。

一个解决方法是每次更改模型时保存模型(因此每次<input>的值都会发生变化。这样可以正常工作,但使用HTTP API(与固定装置相反)可能会表现不佳。

这可能是由于BC在ember-data lib中发生了变化吗? 还有什么可能导致这种情况?


我使用的库的版本:

jQuery:2.0.3

Handlebars 1.0.0

EmberJS:1.0.0 RC7

Ember数据:v0.13-102-g6bdebe7

2 个答案:

答案 0 :(得分:10)

  

在读完Ember中的模型生命周期 - http://emberjs.com/guides/models/model-lifecycle/#toc_in-flight后 - 我仍然不明白为什么会出现这个错误。

这不是一个错误,飞行中的部分说的就是这一切:

  

正在传输的记录是已提供给适配器以保存本地更改的脏记录。一旦服务器确认已成功保存更改,记录将变为干净。

这意味着您正在尝试更改记录,而之前的更改会使其变脏,并且可能仍在调用this.get('store').save()等待服务器响应。在此时间范围内,您无法在不收到错误的情况下对同一记录进行更改。

所以一个解决方案可能是在文本框的字符发生变化之后不会触发this.get('store').save(),而是集中注意力,例如,或者甚至使用显式按钮来保存您可以禁用的记录,直到您的服务器确认为止它的变化,这不会向服务器请求每个字符,导致由于某些延迟而导致性能低下。希望这是有道理的。

希望它有所帮助。

答案 1 :(得分:3)

我在“入门指南”中遇到了同样的问题。我通过检查模型当前是否正在acceptChanges中保存来解决它:

acceptChanges: function() {
  var model = this.get('model')
  if (model.get('isSaving')) { return }

  this.set('isEditing', false)
  model.save()
}