ExtJS 4.1.0
2013 年 6 月 6 日更新:
これと同じ質問を Sencha フォーラムに投稿しましたが、あまりアクションはありませんでした。投稿はほぼ同じですが、参照用にここに追加すると思いました。ExtJS アプリケーションの非常に一般的なシナリオについて、他のコミュニティ メンバーの意見を聞きたいと思っています。 http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores
2013 年 7 月 16 日更新 (結論?)
Sencha の投稿は、ほとんど議論を集めませんでした。複雑な保存操作の負荷の大部分をアプリケーション サーバーに置き、必要に応じてクライアント ストアを遅延更新することにしました。このようにして、独自のデータベース ラッパーを使用して、1 つの複雑なドメイン オブジェクトの保存に関連付けられたすべてのトランザクションを包含し、原子性を保証することができます。新規Order
の保存が、注文メタデータ、10 個の新しいインスタンス、OrderContents
および潜在的に他の情報 (他のテーブルに存在する住所、注文作成時に定義された新しい顧客など) の保存で構成されている場合、ペイロードをアプリケーションに送信したいと思います。クライアント側のアプリケーション コードで下品なコールバックの Web を確立するのではなく、サーバーを使用します。1 対 1 で関連付けられているデータ ( Order
hasOneなどAddress
) は、success
操作のコールバックOrder.save()
。のコンテンツなどのより複雑なデータは、Order
を呼び出すだけで遅延処理されますcontentStore.sync()
。これは、圧倒的な数のクライアントコールバックなしで原子性を保証する手段だと思います
元の投稿内容
関連付けが多いモデルを保存するという全体的に期待外れの機能を考えると、私は自分のアプリケーションでモデルの関連付けをほとんど捨てて、関連付けられたデータを自分で取得することに頼っています。これはすべて問題ありませんが、残念ながら、実際にデータを保存し、ExtJS ストアを更新してサーバー上の変更を反映するという問題は解決されません。
たとえば、メタデータと注文の部品でOrder
構成されるオブジェクトの保存を考えてみましょう。OrderContents
メタデータOrder_Data
はデータベースのテーブルに格納されますが、コンテンツはすべて、Order_Contents
各行が列を介して親注文にリンクされているテーブルに格納されorder_id
ます。
クライアントでは、注文のコンテンツを取得することは、関連付けを必要とせずに非常に簡単に行うことができます: var contents = this.getContentsStore().query('order_id', 10).getRange()
. ただし、主な欠陥は、これがExtJS Storeで利用可能なコンテンツ レコードにOrderContents
依存していることです。これは、データ サーバーによって返されない関連付けを「メイン」オブジェクトと使用している場合に適用されます。
注文を保存するとき、注文のメタデータ (日付、注文番号、サプライヤー情報など) とコンテンツの配列を保持する単一の要求を送信します。これらのデータはバラバラに選択され、適切なテーブルに保存されます。これは私にとって十分に理にかなっており、うまく機能します。
アプリケーションサーバーから保存/更新されたレコードを返すまでは、すべて問題ありません。リクエストは を呼び出すことによって開始されるため、ストアに新しいレコードが利用可能であることOrderObject.save()
を伝えるものは何もありません。OrderContents
代わりに store にレコードを追加して を呼び出すと.sync()
、これは自動的に処理されますが、これにより保存プロセスが複雑になると感じており、言うまでもなく、アプリケーションサーバーでこの分離を処理したいと思います。リクエスト全体を保存することは非常に優れています同じように。
これを解決するより良い方法はありますか?私の現在の解決策は次のとおりです...
var orderContentsStore = this.getOrderContentsStore();
MyOrderObject.save({
success: function(rec, op){
// New Content Records need to be added to the contents store!
orderContentsStore.add(rec.get('contents')); // Array of OrderContent Records
orderContentsStore.commitChanges(); // This is very important
}
});
ストアに追加されたレコードを呼び出すことによりcommitChanges()
、クリーン (非ファントム、非ダーティ) と見なされるため、ストアのgetModifiedRecords()
メソッドによって返されなくなります。当然のことながら、store.sync()
.
このアプローチは、ちょっとずさんでハックなように思えますが、より良い解決策を見つけていません...
ご意見やご感想をお待ちしております。