0

サーバーとの通信にはRequestFactoryを使用し、クライアント側ではRequestFactoryEditorDriverを使用します。したがって、編集ワークフローはそのように見えます。編集用の新しいプロキシを作成します。

RequestContext reqCtx = clientFactory.getRequestFactory().Request();
UserAndAccountProxy userAndAccountProxy = reqCtx.create(UserAndAccountProxy.class);
reqCtx.saveAndReturnProfileAndAccount(userAndAccountProxy).to(
    new Receiver<UserAndAccountProxy>() {
      @Override
      public void onSuccess(UserAndAccountProxy response) {
      ...
      }

      @Override
      public void onFailure(ServerFailure error) {
        ...
      }}

そして、保存ボタンのクリック処理:

    RequestContext reqCtx = view.getEditorDriver().flush();
    reqCtx.fire();

サーバー側では、saveAndReturnProfileAndAccountメソッドは、永続化時に例外をスローできます。これは、onFailureメソッドで処理できます。その後、新しいリクエストコンテキストで新しいプロキシを作成し、それをエディタに渡すと、すべてのフィールドが空白になります。では、リクエストを実行する適切な方法は何ですか?何か問題が発生した場合は、ユーザーがすでに入力しているデータを使用するか、編集作業を間違えた可能性がありますか?

4

1 に答える 1

0

だから、私は解決策を見つけたと思います。RequestContext を作成する関数に変更を加えました。

  private void edit(MyProxy proxy) {

    RequestContext reqCtx = clientFactory.getRequestFactory().Request();

    if (proxy == null) {
      // create proxy first time
      proxy = reqCtx.create(UserAndAccountProxy.class);
    } else {
      // create immutable copy
      proxy = reqCtx.edit(proxy);
    }

    final UserAndAccountProxy tmp = proxy;

    reqCtx.saveAndReturnMyProxy(proxy).to(new Receiver<MyProxy>() {

      @Override
      public void onFailure(ServerFailure error) {
        eventBus.showErrorInformation(error.getMessage());
        //recursive call with already filled proxy
        edit(tmp);
      }

      @Override
      public void onSuccess(UserAndAccountProxy response) {
        eventBus.showInformation("It`s ok!");
        eventBus.goToMainPage(null);
      }
    });
    // start editing with editor
    getView().onEdit(tmp, reqCtx);
  }

プロキシ関数の編集を開始するときは、null 引数を指定して edit を呼び出す必要があり、新しいクリーン プロキシが作成されます。その後、エディタで編集を開始します。[保存] ボタンをクリックすると、サーバーへのリクエストが実行されます。成功した場合は、別のページを開きます。リクエストがエラーで終了した場合、新しい不変コピーを作成し、それをエディターにプッシュします。

于 2012-11-12T13:48:09.660 に答える