1

クライアント側で MVC を使用する Flex アプリケーションを作成しています。GraniteDS を使用しているため、リモート遅延読み込みと逆遅延読み込み機能があります。

ユーザーはアプリケーションにログインし、ボタンをクリックして電子メール アドレスを更新します。次にコントローラーが呼び出されますが、次にどの順序で処理を行うべきかわかりません。次のオプションが表示されます。

オプション

  1. クライアントでモデルを更新し、更新をサーバーに送信します。サーバーがエラーをスローした場合は、データの位相がずれているため、Flex アプリケーションをリロードするようにユーザーに伝えてください。それ以外の場合は、更新が正常に行われたと想定してください。
  2. コントローラーはデータをサーバーに送信し、サーバーが応答した後、コントローラーは更新されたデータでクライアント モデルを更新します。サーバーの応答が受信されない場合は、エラーが発生したことをユーザーに伝え、データの位相がずれている可能性があるため、アプリケーションをリロードするように依頼してください。

オプション 2 の方が優れているようですが、実装方法がわかりません。私のオプションは何ですか?

ソリューション

  1. MyUserのクローンを作成し、クローンをサーバーに送信します。サーバーがMyUserを返したら、モデルを更新します。クローンは元のコレクションをコピーするだけでクローンを作成しないため、MyUserのコレクション内のより深くネストされたオブジェクトをどのように処理しますか?
  2. MyUser.idを変更されたデータとともにサーバーに送信します。IDを使用してサーバーにMyUserをロードし、データを変更します。サーバーでデータが変更されたら、コントローラーがモデルを更新できるように、 MyUserをクライアントに返します。

解決策 2 は、Lazy/Reverse Lazy ローディングの GraniteDS 機能を回避するため、これを行うには非常に悪い方法のように思われます。

これを行うためのベストプラクティスの方法はありますか?

4

1 に答える 1

0

フレックスオブジェクトを保存するときにデータの競合が発生した場合、フレックスアプリケーション全体をリロードすることはあまり便利ではありませんが、機能し、非常に信頼できる解決策です。リクエストの場合: メッセージを表示し、フレックス クライアントがリクエストを再送信できるようにする必要があります (たとえば、ネットワークの問題)。ほとんどの場合は問題ありません。n が失敗した後にアプリケーションを再起動するのが面倒な場合は、カウンターを追加します (URLRequest を使用して、flex アプリケーションがそれ自体をリロードするようにプログラムできます)。

MyUser の複製について: ObjectUtil.copy() で基本的な AMF シリアライゼーションを使用する場合、実際には IExternalizable に基づく「ディープ コピー」であり、granite シリアライゼーションはそれに基づいているため、ネストされたフィールドがコピーされます。したがって、オブジェクトの複製に関するソリューションは機能するはずです。

granited は好きなように自由に使用できます。たとえば、多くの人は、独自の問題が発生する場合でも、遅延機能を無効にすることを好みます。データの競合に対処することは常にカスタムなことだと思います.Graniteでさえ、すべての問題を解決するフレームワークを期待しないでください.

于 2013-09-16T13:25:53.987 に答える