1

Ember Data のアダプターは、編集されたレコードを のさまざまなグループEmber.OrderedSets、つまり、 commitDetails.createdcommitDetails.updated、およびcommitDetails.deletedに保存します。

model.save()モデルコントローラからグループcreateRecord()に配置されcommitDetails.createdます。model.save()モデルコントローラーからグループacceptChangesに配置されますcommitDetails.updated。しかし、配置の関連付けが発生するコードが見つかりません。

それらがEmber トランザクションのコミット関数(アダプタの を呼び出しcommit、次にアダプタの を呼び出す) でインスタンス化されることを知っていますsave。このプロセス全体を通して、作成/更新/削除基準に従ってレコードが正確にどこにソートされているかわかりません。

4

1 に答える 1

3

あなたが何を求めているのかよくわかりませんが、レコードが適切なcommitDetailsセットに追加される場所を探しているなら、これcommitDetailsがプロパティ自体で探している行だと思います。

関連するコードは次のとおりです。

forEach(records, function(record) {
  if(!get(record, 'isDirty')) return;
  record.send('willCommit');
  var adapter = store.adapterForType(record.constructor);
  commitDetails.get(adapter)[get(record, 'dirtyType')].add(record);
});

それを見てみましょう。

forEach(records, function(record) {
  if(!get(record, 'isDirty')) return;

上記は、トランザクションの各レコードについて、ダーティでない場合は無視することを示しています。

record.send('willCommit');

それ以外の場合は、その状態を inFlight に更新します。

var adapter = store.adapterForType(record.constructor);

レコードのアダプターを取得します。

commitDetails.get(adapter)

このメソッドの先頭でインスタンス化されたアダプターの作成/更新/削除されたトリオ オブジェクトを検索します。これは、値が空の OrderedSet である、作成、更新、および削除された 3 つのプロパティを持つ単純なオブジェクトです。

[get(record, 'dirtyType')]

取得したばかりのオブジェクトから適切な OrderedSet を取得します。たとえば、現在のレコードが更新された場合、get(record, 'dirtyType')は文字列 を返しますupdated。角かっこは単なる標準の JavaScript プロパティ ルックアップであるため、前の手順でトリオ オブジェクトから更新された OrderedSet を取得します。

.add(record);

最後に、レコードを OrderedSet に追加します。ループの後続の反復では、同じタイプの他のレコードを追加するため、作成されたすべてのレコードが 1 つのセットに追加され、更新されたすべてのレコードが別のセットに追加され、削除されたすべてのレコードが 3 番目のセットに追加されます。

メソッド全体の最後で最終的にプロパティから返されるのは、キーがアダプターであり、値が作成、更新、および削除された 3 つのプロパティを持つこれらのオブジェクトである Map です。これらはそれぞれ、そのアダプター用に作成され、そのアダプター用に更新され、そのアダプター用に削除された、トランザクション内のすべてのレコードの OrderedSets です。

この計算されたプロパティは とマークされvolatileているため、誰かがプロパティを取得するたびに再計算されることに注意してくださいcommitDetails

于 2013-07-13T02:03:02.650 に答える