0

我有一个文本区域和一个按钮。当我在文本区域中放置一些文本(在粘贴浏览事件时,所有其他事件都被忽略)或单击按钮时,相同的调用将通过文本区域的值更改处理程序发送到服务器,然后单击按钮的处理程序。如果数据错误,服务器会抛出异常并作为消息框返回给客户端。

因此,当我将一些数据放到文本区域并单击一个按钮时,会出现两个消息框。有没有办法让这种情况出现一个消息框?

一些代码作为问题的示例:

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

我认为 Alexey 所说的是这样的:

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 回答