系统的设置方式,我有一个项目,可以有各种文件(用户提供)与之关联。在我的项目/节目视图中,有一个添加文件的链接。此链接弹出一个jQuery模式对话框,显示我的文件上传表单(远程.gsp)。
因此,用户选择文件并输入注释,并在提交表单时关闭对话框,并刷新项目/显示视图上的文件列表。我最初通过添加
来实现这一目标onclick="javascript:window.parent.$('#myDialog').dialog('close');"
到我的提交按钮。
这很好用,但是当提交一些较大的文件时,我最终会遇到竞争条件,对话框关闭,文件列表在保存新文件之前刷新,因此文件列表已过期(文件仍然可以正确保存。)
所以我的问题是,在表单提交操作完成之前,确保对话框没有关闭的最佳方法是什么?我试过用过
<g:formRemote
&GT;在Grails中标记,并在“after”属性中关闭对话框(根据Grails文档,在表单提交后调用脚本),但是我收到一个错误(取自FireBug),说明
window.parent.$('#myDialog').dialog is not a function
这是一个我在这里缺少的简单的JavaScript / Grails语法问题,还是我完全错了?
非常感谢您的时间和帮助!
答案 0 :(得分:0)
为了避免您提到的竞争条件,我会在提交的页面返回后运行“刷新文件列表”代码。我不熟悉Grails,但是这个psuedoCode应该给你一个想法:
if (file was uploaded successfully){
print "<html>
<body onload='code_refresh_file_list;window.parent.$(\"#myDialog\").dialog(\"close\");'>
file uploaded successfully...
</body>
</html>";
}else{
print "<html>
<body>
could not upload file due to [reason], please re-upload the file
</body>
</html>";
}
注意条件的第一部分上的body onload =''
希望有所帮助
答案 1 :(得分:0)
我是一个新手,不知道Grails,但我一直在做JQuery ajax调用,如下所示。看起来你似乎错了 - 忘记click事件并在从服务器返回文件已成功保存的响应后关闭对话框。
在下面的代码中,函数从服务器,字符串,json,等等接收回来的东西(这是响应),如果你愿意,你可以用它做一些事情,比如显示一条消息并关闭你的对话框。 / p>
$('#myForm').submit(function() {
$.post($(this).attr('action'), $(this).serialize(), function(response) {
myDialog('close'); // pseudo code here
$('message').html(response);
});
return false;
});
顺便说一句,你可能完全接受JQuery并消除与你的HTML混合的javascript。
答案 2 :(得分:0)
可能是因为jquery模式的库在调用对话框关闭时无法使用。试试这个
jQuery(document).ready(function(){
jQuery('#myDialog').dialog('close');
});