3

我正在通过“入门”页面中的介绍性教程学习如何使用 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库中的更改吗?还有什么可能导致这种情况?


我用过的库版本:

jQuery:2.0.3

车把 1.0.0

EmberJS:1.0.0 RC7

Ember 数据:v0.13-102-g6bdebe7

4

2 回答 2

10

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

这不是错误,飞行部分说明了一切:

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

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

因此,一个解决方案可能是this.get('store').save()在文本框的字符发生更改后不触发,而是例如聚焦,或者甚至使用显式按钮来保存您可以禁用的记录,直到您的服务器确认它已更改,这不会使向服务器请求每个字符,导致由于一些延迟而导致性能缓慢。希望这是有道理的。

希望能帮助到你。

于 2013-08-20T16:40:23.370 回答
3

我在使用入门指南时遇到了同样的问题。我通过检查模型当前是否保存在解决它acceptChanges

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

  this.set('isEditing', false)
  model.save()
}
于 2013-08-26T04:00:21.740 回答