所以我有一个函数,如果发生了什么事我需要显示一个带有表单和一些字段的Window。我不希望其余的代码运行,直到我关闭窗口。完全像一个messageBox,但在一些其他东西里面有一个表单。据我所知,messageBox非常简单,这就是我使用窗口的原因。 但窗口没有回调方法或其他东西使其余的代码等待窗口关闭(隐藏)。 我可能有错误的方法。我愿意接受建议。我宁愿继续使用带有modal = true的窗口类。
答案 0 :(得分:0)
我不知道这是否适用于您的情况,但这是我能够实现这一目标的方式。需要注意的是我可以完全控制表单提交中的服务器响应。
首先,向您的页面公开一个可以从本机javascript调用的方法。
public native void exportFormSubmissionProcessComplete(MyPresenter cop)/*-{
$wnd.formSubmissionProcessComplete = $entry(function(result) {
cop.@com.client.package.MyPresenter::formSubmissionProcessComplete(Ljava/lang/String;)(result);
});
}-*/;
然后创建您刚刚导出的方法"作为JSNI
private void formSubmissionProcessComplete(String result){
if(result != null){
//Process the results from where ever you submitted your form
}
}
接下来,您从表单提交中制作HTML响应以触发公开的JSNI方法。 (我使用的是一个java servlet,这就是我的例子)
//...Arbitrary servelet processing code
response.setContentType("text/html");
response.getWriter().print("<!DOCTYPE html><head><title>FormProcessComplete</title>");
Map<String, String> data = parseData(buffer.toString());
if(data.get(RESULT).equals("0")){
//SUCCESS
response.getWriter().print("<script type=\"text/javascript\">window.parent.formSubmissionProcessComplete(\"SUCCESS|" + data.toString().trim() + "\");</script>");
}else{
//FAIL
response.getWriter().print("<script type=\"text/javascript\">window.parent.formSubmissionProcessComplete(\"FAIL|" + data.toString().trim() + "\");</script>");
}
response.getWriter().print("</head><body></body></html>");
//...Arbitrary servelet processing code
最后一部分是将FormPanel窗口小部件抛出到Frame窗口小部件中,并将FormPanel的目标设置为将根据上面的示例生成HTML响应的服务器端点。然后获取Frame小部件并将其显示在DialogBox中。
public static void submitForm(String actionURL, String qryString, DialogBox formProcessingDialog) {
Frame processFormWindow = new Frame();
processCCWindow.setSize("1px", "1px");
formProcessingDialog.setGlassEnabled(true);
formProcessingDialog.setText("Processing Form");
VerticalPanel panel = new VerticalPanel();
FormPanel form = new FormPanel();
//Do whatcha gotta do to make your form here
panel.add(processFormWindow);
panel.add(form);
formProcessingDialog.setWidget(panel);
formProcessingDialog.center();
formProcessingDialog.show();
processFormWindow.setUrl(actionURL + "?" + qryString);
}
这不是100%即插即用,但希望它会让你朝着一个适合你的方向前进。