0

シンプルな風/ノックアウト ベースの SPA があります。エンティティのリストに「単一保存」オプションを実装する必要がありました。編集は、別のポップアップではなく、リストで行う必要がありました。

サーバーを保存すると、エンティティの特定の属性のみが更新されたことを確認し、「最終更新日」属性も更新します。

エンティティのリストは、1 つのエンティティ マネージャによってサーバーから取得されました。

単一の保存を有効にするために、更新されて保存の準備が整ったエンティティがメインのエンティティ マネージャからエクスポートされ、一時的なエンティティ マネージャにインポートされました。保存が実行され、(OK の場合) オブジェクトが再エクスポートされ、メイン エンティティ マネージャーにインポートされます。

function saveSingle(entity)
{
    var tempMgr = MainEntityManager.createEmptyCopy();
    var exp = MainEntityManager.exportEntities([entity]);
    tempMgr.importEntities(exp, { 
        mergeStrategy: breeze.MergeStrategy.PreserveChanges });
    tempMgr.saveChanges()
    .then(function (saveResult) {
        var reImp = tempMgr.exportEntities();
        MainEntityManager.importEntities(reImp);

        entity.Last_Updated_Date(saveResult.entities[0].Last_Updated_Date());
        entity.entityAspect.entityState = breeze.EntityState.Unchanged;

        logger.success("changes saved");
    })
    .fail(function () {
        logger.error("Single Save failed: " + error.message);
    });
}

ただし、MainEntityManager プロセスへの再エクスポート/インポートで保存した後、新しい「最終更新日」の値がコピーされないようです。私はこれを回避しましたが、この実装で何か間違ったことをしたのか、「単一エンティティの保存」機能を構築するためのより良い方法があるのか​​ どうか疑問に思っていますか?

コメント、質問大歓迎です!

4

1 に答える 1

0

複数の EntityManagers を使用した Breeze アプリをまだ構築していませんが、この件に関するドキュメントを読みました (あなたもそうしているようですが、そうでない場合: http://www.breezejs.com/documentation/multiple -マネージャー)。

ところで、あなたのコードを見ると、ドキュメントで説明されていることをしているとは思えません。意図的なのかもしれませんが、指摘しておこうと思いました。彼らが推奨するのは、ユーザーが「サンドボックス」EntityManagerから解決されたエンティティに対してローカル編集を行い、何らかの方法で(おそらく、あなたが行っているようにインポートすることによって)変更をマスターEntityManagerに複製することです。

いずれにせよ、Breeze がエンティティを保存するときに、エンティティのコピーを常にサーバーから送り返すとは思いません。
EntityManagerソースからのコメントは次のとおりです。

// visitAndMerge 操作は最適化されているため、 // 保存操作が実際にエンティティを返さなかった場合 (つまり、OData および Mongo の更新と削除中) は実際にはマージを実行しません。

サーバーがエンティティのコピーをサーバーから送り返しているかどうかを確認するには、Fiddler (すべての Web 開発にとって非常に重要なツールです) を実行して、応答で何が返されているかを正確に確認できるようにします。Fiddler は、必要に応じて JSON 応答をきれいに出力します。:-)

于 2014-02-24T13:02:24.933 に答える