一.应用背景:通过第一个dialog编辑主表数据,并通过在第一个dialog上打开的第二个dialog编辑子表数据,希望在第二个dialog中的表单提交后刷新第一个dialog。
二.解决方案分析:
方法1(引用自点击打开链接)
1)在删除按钮上添加callback属性,添加回调函数。
<a class="delete" href="" callback="dialogAjax" target="ajaxTodo" title="确定要删除吗?" fresh="true">
2)扩展dwz,在dwz.dialog.js中添加如下扩展代码:
reloadDialog:function(dialogId){
var dialog = $("body").data(dialogId);
if(dialog){
$.pdialog.reload(dialog.data("url"),{dialogId:dialogId});
}
},
3)在回调函数中使用
function dialogAjax(json){
$.pdialog.reloadDialog("triggerList");
}
方法1缺点:刷新后的第一个dialog的数据不全,部分multiselect数据丢失,且子表table中没有数据,原因不清楚。
方法2(引用自点击打开链接)
1)在 dwz.min.js 中 增加新的方法
function dialogAjaxDoneThis(json){ //840206883@qq.com
DWZ.ajaxDone(json);
if(json.statusCode==DWZ.statusCode.ok){
if(json.navTabId){
$.pdialog.reload(json.forwardUrl,json.navTabId);
}
}
}
2)表单中增加
<input hidden name="navTabId" type="hidden" value="DingdanCreate">
<input hidden name="forwardUrl" type="hidden" value="__URL__/testfunction">
3)将dialogAjaxDoneThis加入第二个dialog中表单的onsubmit中。
方法2缺点同方法1,应该是$.pdialog.reload的问题,所以想尝试方法3。
方法3
原理就是将
$.pdialog.reload(json.forwardUrl,json.navTabId);
替换成
$.pdialog.close(dialog); 参数dialog可以是弹出层jQuery对象或者是打开dialog层时的dlgId.
$.pdialog.open(url, dlgId, title, options);
尝试一下没成功,大概是函数调用的不正确,想到在我的第一个dialog中有多个标签页,且子表所在标签页并不是第一个,即便成功,刷新后的标签将变成第一个,而且重新打开后的dialog位置也会恢复到默认位置,用户体验不好,放弃尝试。
方法4(受启发于点击打开链接中有位哥们提到用loadUrl重载,又结合了方法2的思路)
1)在 dwz.min.js 中 增加新的方法
function reloadDialogWin(json){
DWZ.ajaxDone(json);
if (json.statusCode == DWZ.statusCode.ok){
var id="#"+json.navTabId;
$(id).loadUrl(json.forwardUrl,'11','');
if ("closeCurrent" == json.callbackType) {
$.pdialog.closeCurrent();
}
}
}
2)新增一个专门用来刷新第一个dialog的action:re_edit及相应的re_edit.html,且在Html文件中将默认标签页设成子表所在标签页。另外给原edit.html中的最外层div增加id="re_edit_pwps"; (
不需要新建action和html,只要通过url传递一个默认标签序号过来,将原默认标签页的值换成currentIndex="{:I('dindex')}"就可以了)
2)表单中增加
<input hidden name="navTabId" type="hidden" value="re_edit_pwps">
<input hidden name="forwardUrl" type="hidden" value="__URL__/edit/id/{$vo.pid}/dindex/1或者子表所在标签页">
3)将reloadDialogWin加入第二个dialog中表单的onsubmit中。