0

新しいエンティティ Breeze を作成するときは、id:-1 state:'Added' hasTempKey:true を設定します。エクスポートして再インポートした後、Breeze はインポート -1 エンティティをメモリ内の現在の -1 エンティティとマージせず、新しいエンティティを追加します...これはドキュメントで説明されています... (しかし、この問題をどのように克服するかは私の場合の質問... ) そこで、作成したエンティティを setUnchanged(); に設定しようとしました。現在、エクスポート インポート サイクルは期待どおりに実行されますが、作成されたエンティティは hasTempKey:true プロパティを失っているため、新しく作成されたエンティティは現在のエンティティと競合する可能性があります...これらの問題を解決する方法についてのアドバイスをいただければ幸いです。

4

2 に答える 2

1

この質問は、この SO question で説明されているように、切断されたアプリを実装するためのアプローチに関連していると思います。

私がそこで言ったように、あなたは Breeze をだましてすべきでないことをさせるのに多くの時間を費やしています。ここでは、たとえば、EntityManager.saveChanges実際にはリモート データ ストアに保存しないようにします。しかし、「saveChanges」の要点は、永続的に持続することです。「ローカルに保存」は実際には保存されません。これらの保存された変更を知っているのはあなただけです。それらがサーバー上のビジネス検証ルールに合格するかどうか、または別のユーザーの変更と衝突するかどうかはわかりません。ラップトップが故障したり盗まれたりした場合、ローカルに保存されたデータは失われます。

時折接続されるアプリケーションを作成するには、breeze が大きな助けになると思います。しかし、変更を保存する目的でローカルに隠しておくことと、実際にリモートで保存することを適切に区別することが重要だと思います。

切断されたアプリの概要

別の方法を取ることをお勧めします。

アプリは、一連の個別の編集セッションを簡単に開始できます。たとえば、あるセッションはクライアント「A」の旅行予約、別のセッションはクライアント「B」、そして 3 番目のセッションはまったく別の何かに関するものである可能性があります。おそらくクライアント「C」のプロフィールです。

アプリがサーバーに到達できない場合、各セッションを WIP (「進行中の作業」) として保持します。各 WIP セッションは、WIP キーによって識別される独自のシリアル化されたバンドルです。

余談ですが、このパターンは、John Papa の「Building Apps with Angular and Breeze Part 2」で今年後半に公開される予定です。

BreezeEntityManager.exportEntities(list_of_entities)は、変更状態、元の値、一時キーなど、そのセッションの変更されたエンティティに関するすべてをシリアル化します。list_of_entitiesは、オブジェクト グラフを含め、何でもかまいません。そのバンドルをブラウザーのローカル ストレージに WIP キーで保存し、後で復元できます。

セッション全体の状態に関する情報を含む WIP セッションのディレクトリを保持します (たとえば、編集セッションの種類や、このセッションをリモートで永続化する準備ができているかどうかなど)。アプリは、オフライン時に WIP セッションをユーザーに提示します。接続を取得すると、「同期」フェーズを通過し、その間に変更を保持しようとします。運が良ければ成功します。そうでない場合は、UI でセッションをリハイドレートして、ユーザーが競合を調整できるようにします。

これらは幅広いストロークです。悪魔は細部に宿る。

このコンテキストで重要なことは、エンティティの状態や一時キーをいじらないことです。キーが何であるか、またはそれらが変更されたかどうかは気にしません。シリアル化されたセッションは、その状態情報を保持します。シリアル化されたバンドルは、問題なくローカル ストレージに出入りします。オフラインでもオンラインでも、意図したとおりに Breeze を使用しています。

于 2013-10-25T00:51:23.893 に答える