我有一个文本区域和一个按钮。当我在文本区域中放置一些文本时(在粘贴浏览事件上,忽略所有其他事件)或单击按钮,同一调用将通过文本区域的值更改处理程序发送到服务器,并单击按钮的处理程序。如果数据错误,服务器会抛出异常并返回到客户端作为消息框。
因此,当我将一些数据放入文本区域并单击按钮时,会出现两个消息框。有没有办法让这种情况出现一个消息框?
一些代码作为问题的例子:
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);
}
});
答案 0 :(得分: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
放在代码中的位置。也许在从服务器处理答案之后,可能就是在启动异步调用之后,在等待服务器时启用其他操作。