3

「はじめに」ページの入門チュートリアルを実行して、EmberJS の使用方法を学習しています。ただし、「Accepting edits」の部分に到達すると、バグがあります。

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 ) を読んだ後でも、このバグが表示される理由がわかりません。

回避策の 1 つは、モデルが変更されるたびにモデルを保存することです (つまり、値が<input>変更されるたびに)。

これは、ライブラリの BC 破壊的変更が原因ember-dataでしょうか? 他に何が原因でしょうか?


私が使用したライブラリのバージョン:

jQuery: 2.0.3

ハンドルバー 1.0.0

EmberJS: 1.0.0 RC7

エンバー データ: 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 に答える