24

説明:

私は自分のプロジェクトに ember-data を使用していますが、変更をコミットせずに、オブジェクトをダーティにし、その状態を意図的に再度クリーンに設定する可能性を中心に展開する質問があります。シナリオは次のとおりです。

経由でオブジェクトをフェッチしたとします。そのオブジェクトbanana = App.Fruit.find('banana');には「黄色い果実!」という説明が含まれています。XHR ロング ポーリング (または WebSockets) を使用すると、別のユーザーが説明を「おいしい黄色い果物!」に変更したため、オブジェクトの更新されたバージョンを受け取ることがあります。元のオブジェクトをフェッチしたの任意の時点で。

次に、新しく受信したデータを反映するようにオブジェクトを更新します。このために、私はさまざまなアプローチを試しました:

  • 電話してみましたApp.Store.load(App.Fruit, new_data);。まず第一に、このアプローチは機能しません。第二に、これは私が望んでいるものではありません。自分でオブジェクトにコミットされていない変更を加えることもできましたが、この場合、それらを破棄するのは望ましくありません (load()呼び出しがそれらを上書きすると仮定して)。

  • .set()オブジェクトのプロパティを新しいデータで更新するために、新しいデータをループして、次のように呼び出してみましたbanana.set('description', new_data.description);(該当する場合は汚れていません)。これは機能しますが、オブジェクトが汚れた状態のままになります。

オブジェクトを再度クリーン/更新するために -アダプターに変更をコミットさせないでください! - オブジェクトが移動する状態を調べました。これらは(少なくとも):

  • ステップ 1: 最初に、オブジェクトはrootState.loaded.saved状態にあります。
  • ステップ 2: プロパティを呼び出す.set()と、それが状態にプッシュされrootState.loaded.updated.uncommittedます。
  • ステップ 3: 呼び出すApp.store.commit();と、オブジェクトが状態に戻りますrootState.loaded.saved

savedしたがって、オブジェクトの状態をステップ 2 の後に次のように手動で設定しようとしましたbanana.get('stateManager').goToState('saved');

ただし、これは機能しません。次にストアが他の理由でコミットすると、この操作によってinFlightDirtyReasons is undefinedエラーが生成されます。

質問:

私の質問は、ダーティ オブジェクトの状態を手動でクリーン (保存) に戻すにはどうすればよいですか?

4

13 に答える 13

12

ember-data を見ると、コミットされていない状態に「becameClean」イベントがあり、その結果、レコードが loaded.saved として設定されます。

これでうまくいくはずです

record.get('stateManager').send('becameClean');  
于 2012-11-14T00:11:21.313 に答える
7

@Kamil-j のソリューションの更新です。

現在使用している Ember Data 2.0 の場合、次のことを行う必要があります。

record._internalModel.send('willCommit'); 
record._internalModel._attributes = {};
record._internalModel.send('didCommit');
于 2015-08-28T16:02:35.357 に答える
5

現在ember-data 1.0.0-beta.12:

record.transitionTo('loaded.saved');

それはrecord.get('stateManager')もう必要ないようです。

于 2014-12-15T10:43:48.200 に答える
4

Ember Data 1.0.0-beta.10 で動作するように見えるものは次のとおりです。

record.set('currentState.stateName', 'root.loaded.saved');
record.adapterWillCommit();
record.adapterDidCommit();
record.set('currentState.isDirty', false);

これらすべての行が必要かどうかはわかりませんが、これより前に他の人が行ったことに従っているだけです。

于 2014-10-15T11:59:59.347 に答える
3

エンバー 2.9.1

record.set('currentState.isDirty', false);
于 2017-05-12T22:48:25.140 に答える
1

新しいバージョンでは、ここで言及されているすべてが壊れているようです。

これは、ember-data 1.0.0.beta4でうまくいきました。

record.adapterWillCommit();
record.adapterDidCommit();
于 2014-01-02T17:28:22.650 に答える
1

Ember Data 1.0.0-beta.18 を使用しているときにうまくいった別の方法:

record.rollback()

これにより、ダーティな属性が逆になり、レコードがクリーンな状態に戻りました。

これは、以下を支持して廃止された可能性があるようですrecord.rollbackAttributes: http://emberjs.com/api/data/classes/DS.Model.html#method_rollbackAttributes

于 2015-08-21T20:15:06.187 に答える