1

前提: 私の質問は 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 adapterJSON.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 つの関数を実行すると、次のようなものが表示されます。

  1. 下流にはcurrentTransactionまたはdefaultTransactionがあり、両方とも 内にモデルのすべてのレコードがあります。

    get('store').commit() の場合、最終的に DS.Store の を呼び出し、それが次の呼び出しcommitを行います ( githubを参照) 。

    get(this, 'defaultTransaction').commit();
    

    get('model'). save ( )の場合、最終的に DS.Store のscheduleSaveandflushSavedRecordsを呼び出します。

    get(this, 'currentTransaction').add(record);
    get(this, 'currentTransaction').commit();
    

    最後に acommit()が xxxTransaction で呼び出されることに注意してください。これは DS.Transaction のcommit()です。

  2. DS.Transaction scommit() has acommitDetails , which is based on xxxTransaction, socommitDetails` にもデータのすべてのレコードがあります。(ギットハブ)

  3. 次に DS.Adapter のcommitandsaveが呼び出され、実際にすべてのレコードが更新されます ( github ):

    this.groupByType(commitDetails.updated).forEach(function(type, set) {
       this.updateRecords(store, type, filter(set));
    }, this);
    

    (マイナーな補足/質問: commitDetails が「updated」に設定されたのはいつですか?)

DS.Adapter をカスタマイズできることは知っていますが、明らかに複数のデータ (つまり、すべてのモデル エントリ) を保存する問題は、DS.Store のcommitDefaultTransactioncurrentTransaction.

DS.Store や DS.Adapter のアップストリームをいじくり回すのは悪い考えだと思います。たとえば、save() と commit() の独自のバージョンを作成します。基本的に、カスタマイズしないように言われたものは何でもカスタマイズしたくありません。醜い副作用があるかもしれないからです。

Ember データを使用したいが、一度に 1 つのレコードしか更新できない場合はどうすればよいですか?

4

1 に答える 1

1

transaction()のメソッドを使用して、そのレコードを管理するためだけに新しいトランザクションを作成できますstore。このトランザクションには、 と同じ API がありdefaultTransactionます。

var transaction = this.get('store').transaction();
transaction.add(model)
transaction.commit();

このトランザクションをコミットしても、他の変更には影響しません。その他のアイデアについては、このブログ投稿を参照してください。

于 2013-07-03T05:58:16.777 に答える