0

gwt requestfactory についてあなたの助けが必要です

次のシナリオを検討
して ください: サーバーから既存のエンティティ (請求書としましょう) を取得します。

InvoiceEntityProxy invoice = request1.getInvoice();

いくつか変更を加えたいので、新しいリクエストで編集します。

InvoiceEntityProxy editableInvoice = request2.edit(invoice);
//make some changes to editableInvoice

次に、2 番目のリクエストで行った変更をサーバーに送信して、プレビューを作成します。

request2.createPreview(editableInvoice);

リクエストが送信されると、請求書プロキシは凍結され、新しいリクエストにプロキシを割り当てて編集を再度有効にします。

editableInvoice = request3.edit(editableInvoice);

すべて問題なければ、最新のリクエストを使用してプロキシを更新し、サーバーに送信します。

request3.update(editableInvoice);

しかし、最新のリクエスト (request3) は、request2 に割り当てられたプロキシに加えられた変更について何も知らないため、変更がサーバーに到着することはありません。

次の解決策を考えました:

  1. 最新のプロキシで変更をやり直すことができました。しかし、そのためには、すべての属性を反復処理して再度設定する必要があります (プロキシにいくつかの属性を追加するたびにメソッドを調整する必要があるため、あまり友好的な解決策ではありません)。
  2. 別のアプローチは、id なしで proyx をサーバーに送信し、id を update-method の 2 番目のパラメーターとして送信することです。しかし、これは残念なことです。なぜなら、デルタだけがサーバーに送信されるわけではないからです (これは、requestFactory の優れた機能の 1 つです)。

したがって、別のリクエストに割り当てられたときに、プロキシに既に加えられた変更について request3 に知らせるための最善かつ最も一般的な方法は何ですか。

4

3 に答える 3

1

良い!私の問題の解決策を見つけました。

コンテキストの edit() メソッドは常にプロキシの新しいインスタンスを返すため、元のプロキシのインスタンスがまだ残っています。そのため、リクエストを送信する前に元のプロキシを保存します。

リクエストが成功するたびに、編集メソッドを再度呼び出して、プロキシの編集を再度有効にします。

editableInvoice = request3.edit(editableInvoice);

ここで重要なのは、プロキシの元のプロキシを設定できることです。これは、変更されたかどうか、および何が変更されたかを考慮するために使用されます。これは、AutoBean を使用して行い、PARENT_OBJECT タグを次のように設定します。

AutoBean<InvoiceEntityProxy> editableInvoiceBean = AutoBeanUtils.getAutoBean(editableInvoice);
AutoBean<InvoiceEntityProxy> originalInvoiceBean = AutoBeanUtils.getAutoBean(originalInvoice);

editableInvoiceBean.setTag(Constants.PARENT_OBJECT, originalInvoiceBean);

次のリクエストでは、変更されたすべてのプロパティがサーバーに再度送信されます。

助けてくれてありがとう、AutoBean @Zied Hamdi のヒントをありがとう

于 2014-02-14T10:16:39.123 に答える
1

に電話するのを忘れるだけですfire()。例

request2.createPreview(editableInvoice).fire();

次のリクエストが前のリクエストの結果に依存する場合、OnSuccessリクエストは非同期であるため、メソッドにコードを配置する必要があることに注意してください。

複数のリクエストを追加することも可能です

編集

編集操作と起動操作に同じ要求を使用することが重要です。したがって、この行を置き換えます

request.update(editableInvoice);

request3.update(editableInvoice);
于 2014-02-13T15:45:58.977 に答える
0

オブジェクトの変更を開始する前に、AutoBeansを使用してオブジェクトを複製することもできます。元のものを変更せずに request.edit() して、「汚れた」オブジェクトから変更 (変更のようなイントロスペクション) を適用できます。

EntityProxies は「特別な AutoBeans」であるため、処理方法について調査する必要があるかもしれません。特別なユーティリティ オブジェクトを使用して json にシリアル化する必要がありました (GWT で利用可能)。そのため、ディープ コピーを行う際にも特別な処理が行われる場合があります。

GWT が各 EntityProxy のバージョンを 1 つだけ保持することに問題がある可能性があります (それがグローバルなのか、リクエストのコンテキストでのみなのかを確認したことはありません)。

于 2014-02-13T21:12:03.427 に答える