繁体   English   中英

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

[英]Attempted to handle event `willCommit` on while in state root.loaded.updated.inFlight

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

把手1.0.0

EmberJS:1.0.0 RC7

Ember数据:v0.13-102-g6bdebe7

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

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

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

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

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

希望能帮助到你。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM