1

保存操作が失敗した場合、Breeze エンティティの古い状態を回復する必要があります。

Breeze エンティティをコピーする方法が見つかりませんか? angular.copy を使用すると、循環参照例外「TypeError: 循環構造を JSON に変換しています」が発生します。

Douglas crockford 氏の実装である cycle.js で試してみましたが、同じオブジェクトが返ってきませんでした

4

2 に答える 2

2

保存操作が失敗した場合、クライアント側の状態は引き続き「追加」、「変更」、または「削除」のいずれかになります。変更は、保存が成功した場合にのみ受け入れられます。これにより、問題を「修正」した後、変更を再構築することなく、同じエンティティまたは複数のエンティティを「再保存」できます。

また、Breeze EntityAspect.rejectChangesを使用して、エンティティを最後にクエリしたときの状態に戻すこともできます。

エンティティをコピーする最も簡単な方法は、Breeze EntityManager.createEntityメソッドを使用して、ソース エンティティのデータ プロパティのみを含むオブジェクトを渡すことです。これが機能する理由は、新しいエンティティが entityManager にアタッチされると、Breeze が外部キー データ プロパティに基づいてすべてのナビゲーション プロパティを自動的にリンクするためです。これは createEntity 呼び出しの最後のステップとして内部的に行われます。

したがって、次のようなことを試すことができます (このコード フラグメントを実際にテストしたわけではありませんが、このアプローチは確実に機能します。

function cloneEntity(sourceEntity, keyName, newKeyValue) {
   var sourceEntityType = sourceEntity.entityType;

   var sourceDataProperties = sourceEntityType.dataProperties;
   var configEntity = {};
   sourceDataProperties.forEach(function(dp) {
      configEntity[dp.name] = sourceEntity.getProperty(dp.name);
   });
   // you will need to give the entity a unique key before calling createEntity
   // you could also get the keyName from metadata but I was too lazy to do that here.
   configEntity[keyName] = newKeyValue;

   var cloneEntity = myEntityManager.createEntity(fooEntityType, configEntity, breeze.EntityState.Added);
   return cloneEntity;
}
于 2013-10-21T22:09:31.217 に答える
0

EntityAspect.rejectChanges()を使用してみましたか?

エンティティが最後に照会されて「rejectChanges」が呼び出されてからエンティティに加えられたすべての変更を拒否することにより、エンティティを「Unchanged」の EntityState に戻します。

于 2013-10-21T14:34:26.567 に答える