0

テキストエリアとボタンがあります。テキスト領域にテキストを入力するか (貼り付け参照イベントでは、他のすべてのイベントは無視されます)、ボタンをクリックすると、テキスト領域の値変更ハンドラーとボタンのクリック ハンドラーを介して同じ呼び出しがサーバーに送信されます。データが間違っている場合、サーバーは例外をスローし、メッセージ ボックスとしてクライアントに返します。

そのため、テキスト領域にデータを入力してボタンをクリックすると、2 つのメッセージ ボックスが表示されます。このような場合に 1 つのメッセージ ボックスを表示する方法はありますか?

問題の例としていくつかのコード:

textArea.addValueChangeHandler(new ValueChangeHandler<String>() {
    @Override
    public void onValueChange(ValueChangeEvent<String> event) {
        fireHandlers();
    }
});

button.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        fireHandlers();
    }
});

//............

private void fireHandlers() {
    for (MyProcessHandler handler : myHandlersList) {
    handler.handle();
    }
}

//............

public static interface MyProcessHandler {
    public void handle();
}

//............

addMyProcessHandler(new MyProcessHandler() {
    @Override
    public void handle() {
        AsyncCallback<String[]> ac = new AsyncCallbackAdapter<String[]>() {
            public void onSuccess(String[] data) {
                //post processing
            }

            @Override
            public void onFailure(Throwable throwable) {
                super.onFailure(throwable);
            }
        };
        RemoteCall.getMyService().getResultFromData(textArea.getData(), ac);
    }
});
4

1 に答える 1

0

アレクセイの言うことはこんな感じだと思います。

private boolean eventFired = false;

textArea.addValueChangeHandler(new ValueChangeHandler<String>() {
    @Override
    public void onValueChange(ValueChangeEvent<String> event) {
        fireHandlers();
    }
});

button.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        fireHandlers();
    }
});

//............

private void fireHandlers() {
    if(!eventFired) {
        eventFired = true;
        for (MyProcessHandler handler : myHandlersList) {
            handler.handle();
        }
    }
}

//............

public static interface MyProcessHandler {
    public void handle();
}

//............

addMyProcessHandler(new MyProcessHandler() {
    @Override
    public void handle() {
        AsyncCallback<String[]> ac = new AsyncCallbackAdapter<String[]>() {
            public void onSuccess(String[] data) {
                eventFired = false;
                //post processing
            }

            @Override
            public void onFailure(Throwable throwable) {
                super.onFailure(throwable);
                eventFired = false;
            }
        };
        RemoteCall.getMyService().getResultFromData(textArea.getData(), ac);
    }
});

コードをどこに配置するかを決定eventFired=falseします。サーバーからの応答を処理した後、非同期呼び出しを開始してサーバーを待機している間に別のアクションを有効にした直後などです。

于 2013-02-12T10:51:38.710 に答える