Я использую GWTP для создания своего веб-приложения. Вот моя проблема. У меня есть страница клиента (CustPresenter). Когда эта страница посещается, она вызывает и загружает данные из базы данных.
Загрузка всех данных может занять некоторое время, поэтому я хочу, чтобы мой текущий браузер был заблокирован, чтобы пользователь не мог ничего щелкнуть, пока данные еще не завершили загрузку.
Итак, вот что я думаю. Я хочу показать DialogBox прямо перед вызовом RPC и скрыть его, когда вызов завершится. Посмотрите на приведенный ниже код:
public class CustPresenter extends
Presenter<CustPresenter.MyView, CustPresenter.MyProxy> {
private DialogBox loadingDialogBox=new DialogBox();
@Inject DispatchAsync dispatchAsync;
@Override
public void prepareFromRequest(PlaceRequest request){
super.prepareFromRequest(request);
loadingDialogBox.show();
GetData getDataAction=new GetData();
dispatchAsync.execute(getDataAction, getDataCallback);
}
private AsyncCallback<GetDataResult> getDataCallback=new AsyncCallback<GetDataResult>(){
@Override
public void onFailure(Throwable caught) {
loadingDialogBox.hide();
}
@Override
public void onSuccess(GetVerbFromTripleResult result) {
//show data here (it may take long time)
loadingDialogBox.hide();
}
};
}
Однако при запуске диалоговое окно появляется только на 1 секунду, а затем исчезает. Сразу после этого все графические интерфейсы UiBinder отображаются на странице клиента, и пользователь может нажимать любые кнопки на странице, пока данные еще не завершили загрузку. Это не правильное поведение.
Я хочу сделать что-то вроде этого http://sqlfiddle.com/#!2/a2581/1< /а>. Как вы можете видеть, когда вы впервые открываете эту ссылку, появляется всплывающая панель загрузки, и вы не можете ничего щелкнуть, пока не появятся все графические интерфейсы.
Я также пытался сделать Custom AsyncCallback, но ничего не произошло.
public abstract class AsyncCall<T> implements AsyncCallback<T> {
PopupPanel myp=new PopupPanel();
/** Call the service method using cb as the callback. */
public AsyncCall()
{
myp.setTitle("loading");
myp.show();
}
public final void onFailure(Throwable caught)
{
myp.hide();
onCustomFailure(caught);
}
public final void onSuccess(T result)
{
myp.hide();
onCustomSuccess(result);
}
/** the failure method needed to be overwritte */
protected abstract void onCustomFailure(Throwable caught);
/** overwritte to do something with result */
protected abstract void onCustomSuccess(T result);
}
Итак, почему у меня эта проблема?
Как это исправить?
Или вообще, как проще всего отобразить «индикатор загрузки» во время вызова RPC в GWTP?