前提: 私の質問は Ember-data の私の研究に基づいており、正しい場合とそうでない場合があります。誤解がある場合は修正してください。サンプルは、2013 年 7 月 2 日現在の最新の ember で実行されています。
私のモデルのレコードを 1 レコードだけ編集するには、this.get('store').commit()
またはを呼び出す必要がありますthis.get('model').save()
。ただし、これらの関数のいずれかの下流では、実際にはモデルのすべてのレコードを更新する必要があります。したがって、特にモデルに多数のレコードがある場合、これは非常に非効率的です。
1 つのレコードの編集を保存するときに、1 つのレコードだけを更新する最良の方法は何ですか?
更新: この問題は、 RESTAdapterではなくlocal-storage-adapterでのみ発生します。
更新 #2: 大きな誤解がありました。すべて問題ありません。save() と commit() はどちらも 1 つのレコードのみを更新_saveData
します。すべてのレコードを出力する local storage adapterのJSON.stringify(this._data)にだまされました。印刷されたものは変更されたデータであると想定しましたが、updateRecordsと_didSaveRecords_saveData
の の呼び出し元は、私が変更していた単一のレコードであることが判明しました。「モデルのすべてのレコード」を含むさまざまなオブジェクトに関する以下のステートメントは、もはや複製できません。デバッグ情報を読み間違えたようです。現在、オブジェクト全体に対してのみ setItem できる localstorage を使用して
いるため、これは理にかなっていますrecords
_saveData
、私の場合はすべてのレコードを含むモデルです。localstorage はそのオブジェクトの個々のエントリを更新できないため、JSON にはすべてのレコードが含まれている必要があります。
詳細:
実行例:
this.get('store').commit()
この jsbin の投稿doneEditing
を更新する際に使用されます。this.get('model').save()
todo この jsbinacceptChanges
を更新する際に使用されます。
Chrome のデバッグを有効にして上記の 2 つの関数を実行すると、次のようなものが表示されます。
下流には
currentTransaction
またはdefaultTransaction
があり、両方とも 内にモデルのすべてのレコードがあります。get('store').commit() の場合、最終的に DS.Store の を呼び出し、それが次の呼び出し
commit
を行います ( githubを参照) 。get(this, 'defaultTransaction').commit();
get('model'). save ( )の場合、最終的に DS.Store の
scheduleSave
andflushSavedRecords
を呼び出します。get(this, 'currentTransaction').add(record); get(this, 'currentTransaction').commit();
最後に a
commit()
が xxxTransaction で呼び出されることに注意してください。これは DS.Transaction のcommit()
です。DS.Transaction
s
commit()has a
commitDetails, which is based on xxxTransaction, so
commitDetails` にもデータのすべてのレコードがあります。(ギットハブ)次に DS.Adapter の
commit
andsave
が呼び出され、実際にすべてのレコードが更新されます ( github ):this.groupByType(commitDetails.updated).forEach(function(type, set) { this.updateRecords(store, type, filter(set)); }, this);
(マイナーな補足/質問: commitDetails が「updated」に設定されたのはいつですか?)
DS.Adapter をカスタマイズできることは知っていますが、明らかに複数のデータ (つまり、すべてのモデル エントリ) を保存する問題は、DS.Store のcommitDefaultTransaction
とcurrentTransaction
.
DS.Store や DS.Adapter のアップストリームをいじくり回すのは悪い考えだと思います。たとえば、save() と commit() の独自のバージョンを作成します。基本的に、カスタマイズしないように言われたものは何でもカスタマイズしたくありません。醜い副作用があるかもしれないからです。
Ember データを使用したいが、一度に 1 つのレコードしか更新できない場合はどうすればよいですか?