我正在通过“入门”页面的入门教程学习如何使用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
答案 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()
}